Java Heap


- Java Heap의 메모리 해제는 오로지 Garbage Collection에 의해 수행됨을 JVM 스펙에 제시되어 있다.

- 제시된 스펙을 각 Vendor(Oracle-Hotspot, IBM ..) 들은 최대한 따르고 있다.

- 하지만 이에 대한 Gabage Collection, Heap 영역의 구현은 각 Vendor 별로 다르다.



Oracle Hotspot JVM의 Heap


- 그 중 가장 대중적으로 알려진 Oracle HopSpot JVM의 구조는 다음과 같다.





1) Young Generation : Eden 영역과 Survivor영역으로 구성

 

- Eden 영역은 Object(객체)가 최초로 Heap에 할당되는 장소이다. 만일 Eden 영역이 가득 찼다면, Object의 참조 여부를 파악하고 Live Object는 Suvrvior 영역으로 넘긴다. 그리고 참조가 사라진 Garbage Object이면 남겨 놓는다. 그리고 모든 Live Object가 Survivor 영역으로 넘어간다면 Eden 영역을 모두 청소한다. 


- Survivor 영역은 Survivor0과 Survivor1로 구성되며 Eden 영역에 살아 남은 Object들이 잠시 머무르는 곳이며 Live Object들은 하나의 Survivor 영역만 사용하게 되며 이러한 전반적인 과정을 Minor GC라고 한다.




2) Old Generation


- Young Generation은 새로 Heap에 할당된 Object가 들어오는 것이 아닌, Survivor 영역에서 살아남아 오랫동안 참조 되었고 앞으로도 사용될 확률이 높은 Object들을 저장하는 영역이다. 이러한 Promotion 과정 중 Old Generation의 메모리가 충분하지 않으면 해당 영역에서 GC가 발생하는데 이를 Major GC라고 한다.(Tenured 영역에서 발행한 GC)



3) Perm 


- Perm 영역은 보통 Class Meta 정보나 Method의 메타 정보, static 변수와 상수 정보들이 저장되는 공간으로 흔히 메타데이터 저장 영역이라고 한다. 이 영역은 JAVA8 부터 Native Memory 영역으로 이동하였다.( 기존의 Perm영역에 존재하는 static object는 Heap 영역으로 옮겨졌다.)






JAVA7 까지의 Heap 영역과 Java8의 Heap 영역

이미지 :  http://equj65.net/tech/java8hotspot/






- 가장 큰 차이점은 Perm 영역이 Heap 영역에서 사라졌다는 점이다. Native Memory 영역은 일반적으로 OS Level에서 관리되며 Permanent 영역에 저장 되었던 Class나 Method의 메타 정보들이 Metaspace 영역으로 변경됨에 따라 Heap 영역의 확보의 Max 값을 크게 의식하지 않아도 된다. 


- Perm 영역 메모리 크기 옵션  -XX:PermSize / -XX:PermMaxSize, Metaspace 영역 메모리 크기 옵션 -XX:Metaspace / -XX:MaxMetaspaceSize


- Perm영역과 Metaspace 영역의 기본 값은 시스템 별로 크게 다를 수 있으므로 튜닝 시 초기치와 최대 치를 확인해야 하며, Mac OS 기준 확인 방법은 다음과 같다.



Java7

$ j./java -XX:+PrintFlagsFinal -version -Server | grep "PermSize"






Java8

$ java -XX:+PrintFlagsFinal -version -Server | grep "MetaspaceSize"





MaxMetaspaceSize는 18446.....byte (약 16Exabyte)의 큰 값을 가지고 프로세서가 취급할 수 있는 메모리의 상한치이다. Metaspace는 Native 메모리로 다루기 때문에 프로세스가 이용할 수 있는 메모리 자원을 최대한 활용 할 수 있다. 그러나 이 영역 또한 별도의 옵션을 통해 제한이 가능한데 독자적인 ClassLoader를 구현한 채 메모리 누수를 의심할 경우 

" -XX:MaxMetaspaceSize" 옵션을 활용하여 제한이 가능하다.


하지만 Metaspace는 필요에 따라 자동 증가하며 일반적으로 크게 주의를 갖고 설정할 필요는 없어 보인다.


'JVM Optimization &Tuning' 카테고리의 다른 글

Minor GC , Major GC, Full GC  (0) 2019.12.26
GC 튜닝이 불필요한 상황  (0) 2019.12.26
JVM(Java Virtual Machine)에 대한 이해  (2) 2018.08.12

+ Recent posts