JVM의 메모리 영역으로 자바 애플리케이션을 실행할 때 사용되는 데이터들을 적재하는 영역입니다.
이 부분에 대해서 자세히 알아보자
클래스, 변수, Method, static 변수, 상수 정보 등이 저장되는 영역이다.(모든 Thread가 공유한다.)
명령어로 생성된 인스턴스와 객체가 저장되는 구역이다.(Garbage Collection 이슈는 이 영역에서 일어나며, 모든 Thread가 공유한다, 동기화이슈)
내에서 사용되는 값들(매개변수, 지역변수, 리턴값 등)이 저장되는 구역으로 메소드가 호출될 때 LIFO로 하나씩 생성되고, 메소드 실행이 완료되면 LIFO로 하나씩 지워진다.(각 Thread별로 하나씩 생성된다.)
CPU의 Register와 역할이 비슷하다. 쓰레드가 시작될때 생성, Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록, 현재 실행 중인 JVM 명령의 주소값이 저장된다.(각 Thread별로 하나씩 생성된다.)
JNI(Java Native Interface)를 통해 호출되는 C/C++ 등의 코드를 수행하기 위한 스택이다.
자바 외 다른 언어(C/C++ 등)의 메소드 호출을 위해 할당되는 구역으로 언어에 맞게 Stack이 형성되는 구역이다.
C언어의 경우 malloc, free등을 이용해서 메모리를 할당하고, 일일이 그 메모리를 수거해줘야했다. 그러나 Java 에서는 메모리 관리를 jvm이 대신하기 때문에 GC가 이 역할을 해준다.
heap에서 최초 할당하면 이 영역으로 가게된다.
이 과정이 minorGC 이다
여기서는 새로 할당하는게 아니고 오랫동안 참조되고 앞으로도 계속 씌여질확률이 높은 object들이 여기에 있게된다.
이 과정이 Full GC(MajorGC) 이다
Perm부분이다. java8 이전에는 Permanent Generation 이었지만
java8 이후로 Metaspace로 변경되었다.
그러니까 Metaspace만 기억하도록 하자.
클래스 로더에 의해 로드되는 클래스, 메소드 등에 대한 메타 정보가 저장되는 영역(프로그램 코드가 올라가는 부분)으로 JVM에 의해 사용된다.
리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다.
Code가 모두 로딩되고 나면 거의 일정한 수치를 유지.
동적으로 사이즈를 바꿀 수 있다. MetaspaceSize 및 MaxMEtaspaceSize 옵션이 새로 생겼다.
Full GC(MajorGC) 대상이다.
GC를 실행하기 위해 JVM이 어플리케이션의 실행을 멈춘다, 이를 Stop-the-world라고 한다.
GC 튜닝이란, 이 Stop-the-world의 시간을 줄이는 것이다.