JVM Memory
- Method Area / Static Area
- 클래스 파일의 바이트 코드가 로드되는 곳
- 메인 메소드를 호출함으로써 프로그램 시작을 하게 되는데 메인 메소드에서 사용하는 클래스/ Static변수가 이 영역에 올라온다.
- 메소드 영역에 호출된 메소드를 가지고있는 .class 파일이 메모리에 올라와있어야 하는데
이를 로드하는것이 클래스 로딩
- 클래스 로딩을 위한 JVM의 로딩 과정
- 모든 클래스 수준의 데이터가 저장되며, JVM당 하나의 영역만 존재한다.
- Heap
- 클래스의 인스턴스(흔히 new로 생성되는 객체)와 배열이 할당되는 영역
- 메소드 영역에 로드 된 클래스만 생성이 가능
- GC(Garbage Collector)가 참조되지 않는 메모리를 확인하고 제거한다.
- Detail about Heap
- Eden + Survivor 1, 2 를 합쳐서 Young Generation
- Eden : new를 통해 새로 생성된 객체가 위치한다.
정기적인 GC에서 살아남은 객체들은 Survivor로 이동된다.
- S1 = from space, S2 = to space
Eden에서 GC에서 살아남은 객체는 from space로 이동.
GC가 끝나면 to와 from을 가리키는 포인터를 변경 (맞교환된다)
- Old Generation
-
- 객체가 일정 횟수이상의 GC에서 살아남으면 to space에서 Old로 온다
- 이 공간이 꽉차면 확장을 시도하는데, 이 과정에서 Full GC가 발생한다.
- GC는 크게 Major GC, Minor GC가 있는데 Full GC = Major GC를 의미한다.
- Permanent = Metaspace
- Class Loader에 의해 로드된 클래스들이 저장된다.
- Old와 마찬가지로 꽉자면 확장 시도 -> Full GC 발생 -> 확장 불가시 OOME발생
- GC는 별도 포스팅
- JVM Language Stack
- 각각의 스레드마다 개별의 스택영역이 존재한다.
- 메소드가 호출 될 때마다 메소드 콜스택이 스택에 스택 프레임이라는 메모리를 쌓는다.
- 모든 지역변수, 매개변수가 여기 저장되며, 이 영역은 쓰레드간 공유되지 않음으로 쓰레드 세이프 하다.
- 간단하게 말하면, 메소드가 호출되면 그 메소드에 필요한 것들을 준비하고 호출이 끝나면 스택에서 제거한다.
- 쓰레드가 허락 된 스택 용량보다 많은 계산을 필요로 하면 StackOverFlow 에러가 발생하고,
실행 중인 쓰레드의 스택을 확장할 만큼의 충분한 메모리가 없거나 , 새 쓰레드에게 할당 할 메모리가 없는경우
OutOfMemory 에러가 발생한다.
- PC Register
- 쓰레드가 어떠한 명령을 실행하게 될지에 대한 부분을 기록
- Native Method Stack
- 자바 외 언어로 작성된 네이티브 코드를 위한 메모리 영역
- 자바 코드를 수행하다 JNI를 호출하게 되면 Stack에서 Native Stack으로 확장된다.
- JNI(Java Native Interface) : JVM 위에서 실행 되는 자바코드가 하드웨어/OS 플랫폼에 종속된 프로그램
그리고 C, C++, 어셈블리 같은 다른 언어들로 작성된 라이브러리들을 호출/호출되는것을 가능하게 하는 프레임워크
- 자세한 설명은 추가 포스팅 예정
쓰레드 관점에서의 Runtime data areas
- PC Register / Stack / Native Method Stack 은 쓰레드와 생명주기를 같이한다.
- Heap / Method Area 는 전체 스레드가 공유하는 데이터 영역으로 JVM과 생명주기를 함께한다.
JVM Runtime
참조
자바와 JVM 메모리 구조
JVM 메모리 구조와 GC
JAVA HEAP