Runtime Data Area
JVM의 메모리 영역으로 크게 Method Area, Heap Area, Stack Area, PC Register, Native Method Stack
5개의 영역으로 나뉜다.
Method Area
클래스의 이름, 타입, 멤버변수, 접근제어자, 메소드 이름, 파라미터 타입, 리턴타입 등 클래스 레벨의 정보들이 저장된다.
이 영역에는 Runtime Constant Pool이라는 별도의 관리 영역이 존재하는데, 이 공간은 상수 자료형을 저장해 참조하고 중복을 막는 역할을 한다.
-> 모든 Thread가 공유하는 영역
Stack Area
런타임 중 Method 호출시 각 생성되어 사용되는 영역, 지역변수, 파라미터, 리턴값 등의 정보가 저장된다.
Method 종료시 해당 Stack은 소멸된다.
-> 각 Thread가 공유하지않는 영역
PC Register
각 Thread 생성 시 생성되는 영역
각 Thread가 다음 실행할 명령어의 주소를 저장하고 있으며, Context Swithing이 일어날때 참조하여 다음 명령어를 실행
-> 각 Thread가 공유하지않는 영역
Native Method Stack
Java 외 언어인 C/C++ 등의 네이티브 언어를 실행하기 위한 스택영역
Heap Area
생성된 객체나 배열이 저장되는 영역
User user = new User();
여기서 user는 객체의 메모리 주소를 참조하는 변수로 Stack 영역에 저장되고,
실제 객체는 Heap 영역에 저장됨
주기적으로 참조되지않는 객체는 Garbage Collector에 의해 메모리가 해제됨
-> 모든 Thread가 공유하는 영역
Garbage Collector
주기적으로 Heap 영역의 참조되지않는 객체들의 메모리를 해제 해준다.]
언제 실행되는지는 알 수 없다.
Heap 메모리는 크게 Young Generation, Old Generation으로 나뉘는데,
Young Generation(Eden, survivor) 에는 새로 생성된 객체가 저장되어진다.
Old Generation에는 오래 사용되는 객체가 저장되어진다.
동작
- Minor GC
1. 새로 생성된 객체들은 Eden 영역에 할당된다.
2. Eden 영역이 꽉 차면 참조 되지 않는 객체는 메모리를 해제하고 참조되는 객체들은
하나의 survivor 영역에 복사한 후 Eden 영역을 비운다.
3. 다시 Minor GC가 발생할 때, 위의 1~2번을 수행하면서
현재 메모리가 할당되어 있는 survivor영역을 비우고 참조되고 있는 객체를
다른 survivor 영역으로 옮겨진다.
이때 객체의 헤더에 Age의 값이 증가하게 된다.
4. 1~3번을 반복적으로 수행하다가 Young generation 영역에서 특정 Age값 이상이 되는 객체들은
Old Generation으로 옮기게 됨 -> Promotion
5. Promotion이 반복되고 Old 영역이 꽉 차면 Major GC가 발생
- Major GC
Old 영역이 꽉 차면 Old 영역의 참조 되지않는 객체들을 정리한다.
Old 영역은 Young 영역보다 대체로 크기 때문에 실행속도가 더 느리다.
- Full GC
Minor GC + Major GC를 모두 수행한다. 즉 모든 Heap 영역
수행속도가 매우느리다.
GC를 수행할때, 모든 Thread는 멈추게 되므로 Full GC의 횟수를 줄이는 것이 좋다.
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA] Effective Java - 3. private 생성자나 열거 타입으로 싱글턴 보증 (0) | 2022.08.31 |
---|---|
[JAVA] Effective Java - 2. 점층적 생성자, 자바 빈즈, 빌더 패턴 (0) | 2022.08.17 |
[JAVA] Effective Java - 1. 정적 팩터리 메서드 (0) | 2022.08.04 |
[JAVA] JVM 구조와 동작 1 (JVM, Class Loader, Execution Engine) (0) | 2022.03.31 |
[JAVA] Lombok Builder 사용 시 Generic 처리 (0) | 2021.12.06 |