thread 별로 각각 가지고 있음. (CPU register가 thread local 한 것 처럼 당연히)
Method Area
Memory layout 상 PermGen, MetaSpace 안에 속하는 일부 영역.
OS의 text segment와 유사함. (결국 실행 대상 code, instructions를 보관하는 영역이라는 뜻)
run-time constant pool
field and method data
the code for methods and constructors
**참고) static 변수는 Method Area 안에 들어가는게 아니라(JVM spec에 이런 내용은 없다), Method Area를 감싸고 있는 PermGen 영역에 들어간다. (이 것도 java 8 부터는 PermGen이 사라지면서 달라졌다.)
Method Area 등은 JVM spec에서 사용하는 용어이고, 실제 구현체인 Hotspot JVM에서는 이와 1:1 대응되지 않는 다른 용어(PermGen, Metaspace)를 사용 할 수 있다. 스펙과 실제 구현이 다를 수 있기 때문에 스펙 자체에 뭐가 들어가고 뭐가 안들어가고를 너무 타이트하게 볼 필요는 없다.
JVM Heap 구조와 GC
Eden -> [S0 <> S1] -> Old 순으로 이동한다. (Old == Tenured)
Survivor 영역을 S0, S1 2개로 구성하고 GC 마다 살아남은 객체가 S0 <> S1을 왔다 갔다 하도록 만드는 이유는, 메모리 스페이스를 재정렬해서 연속된 메모리 영역을 확보하기 위함.
PermGen 영역은 Heap의 일부이나, MetaSpace는 Native Memory 영역으로, OS가 관리.
Java 7에서는 PermGen 영역에 일부 Java Object (static 변수, interned string)가 들어갔지만, Java 8 부터는 기존 PermGen에 들어가던 Java Object는 모두 Old 영역에 들어가고, MetaSpace에는 Meta 정보만 들어감.
MetaSpace는 기본이 unbounded 크기라 해당 머신의 메모리를 다 쓰지 않는 한 OOM 발생 가능성 낮음.