<----- Java Heap -----> <--- Native Memory --->
+------+----+----+-----+-----------+--------+--------------+
| Eden | S0 | S1 | Old | Permanent | C Heap | Thread Stack |
+------+----+----+-----+-----------+--------+--------------+
<--------->
Permanent Heap
S0: Survivor 0
S1: Survivor 1
<----- 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는 Java의 Classloader가 로드한 Class의 Metadata를 저장하기 위해 Hotspot JVM에서 구현한 Method 영역이다.
| Java 7 | Java 8 | |
|---|---|---|
| Class 메타 데이터 | 저장 | 저장 |
| Method 메타 데이터 | 저장 | 저장 |
| Static Object 변수, 상수 | 저장 | Heap 영역으로 이동 |
| 메모리 튜닝 | Heap, Perm 영역 튜닝 | Heap 튜닝, Native 영역은 OS가 동적 조정 |
| 메모리 옵션 | -XX:PermSize -XX:MaxPermSize | -XX:MetaspaceSize -XX:MaxMetaspaceSize |