JVM 메모리 모델(Java7/8 기준)

ahnjs·2023년 6월 12일
post-thumbnail

JVM 메모리 구조

  • Java 7 Hotspot JVM 구조
<----- Java Heap ----->             <--- Native Memory --->
+------+----+----+-----+-----------+--------+--------------+
| Eden | S0 | S1 | Old | Permanent | C Heap | Thread Stack |
+------+----+----+-----+-----------+--------+--------------+
                        <--------->
                       Permanent Heap
S0: Survivor 0
S1: Survivor 1
  • Java 8 Hotspot JVM 구조
<----- Java Heap -----> <--------- Native Memory --------->
+------+----+----+-----+-----------+--------+--------------+
| Eden | S0 | S1 | Old | Metaspace | C Heap | Thread Stack |
+------+----+----+-----+-----------+--------+--------------+
* Java Heap: JVM이 관리하는 영역
* Native Memory: OS에서 관리하는 영역

Hotspot JVM 기준으로 JVM 메모리 영역은 Heap 영역과 Non-heap(Native Memory) 영역으로 나눠진다.
Java 7은 Permanent Generation 영역이 존재하고, Java 8 이후 해당 영역은 삭제되고 Metaspace 영역이 추가됐다.

Permanent Generation 와 Metaspace

Permanent Generation과 Metaspace는 Java의 Classloader가 로드한 Class의 Metadata를 저장하기 위해 Hotspot JVM에서 구현한 Method 영역이다.

Permanent Generation

  • Permanent Generation는 다음과 같은과 같은 정보를 저장한다.
    • Class의 Metadata (pkg path 정보라고 보면 됨, text 정보)
    • Static Object
    • 상수화된 String Object
  • Permanent Generation은 JVM에 의해 크기가 강제되던 영역이다.
  • 메모리 옵션
    • -XX:PermSize=N --> PermGen Default Size 설정
    • -XX:MaxPermSize=N --> PermGen Max Size 설정

Metaspace

  • Metaspace는 class들의 metadata가 저장되는 공간이다.
  • Metaspace는 Native Memory 영역에 위치하며, OS가 자동으로 크기를 조절한다.
    • 옵션으로 Metaspace의 크기를 줄일 수도 있다.
      • -XX:MetaspaceSize=N --> Metaspace Default Size 설정
      • -XX:MaxMetaspaceSize=N --> Metaspace Max Size 설정
  • Java 8부터는 Permanent Generation 관련 JVM 옵션은 무시한다.

변경된 사항

  • Class Meta-Data는 Native 메모리로 이동된 Metaspace에 저장하고 Static Object와 상수화된 String Object는 Heap 영역으로 보내져서 GC의 대상이 되도록 했다.
Java 7Java 8
Class 메타 데이터저장저장
Method 메타 데이터저장저장
Static Object 변수, 상수저장Heap 영역으로 이동
메모리 튜닝Heap, Perm 영역 튜닝Heap 튜닝, Native 영역은 OS가 동적 조정
메모리 옵션-XX:PermSize
-XX:MaxPermSize
-XX:MetaspaceSize
-XX:MaxMetaspaceSize

결론

  • 메모리 영역에 대한 자유를 최대한 보장해주기 위해 Permanent Generation은 JDK 8부터 MetaSpace라는 이름으로 변경되고 Native Memory 영역으로 변경됨.
  • static object와 상수화된 string object는 heap 영역에서 관리하여 GC의 대상이 됨.
  • 이전에 PermGen 영역으로 인한 OOME가 줄어듦.

0개의 댓글