Heap 영역의 변화
Java 7 JVM의 Heap 영역과 Java 8 JVM의 Heap 영역의 가장 큰 차이 점은 Permanent Generation이 사라지고 Metaspace 영역이 생겨난 것이다.
공통점
- 로드되는 클래스, 메서드 등에 관한 메타 정보를 저장한다.
- 리플렉션 클래스 로드 시 사용된다.
차이점
Permanent Generation | Metaspace | |
Default 크기 | 제한된 고정 크기 | 자동 확장 가능(고정 X) |
속하는 영역 | Heap 영역 | Native Memory 영역 |
이처럼 Metaspace 영역은 JVM에 의해 관리되는 Heap영역이 아닌 OS 레벨에서 관리되는 Native Memory 영역을 이용함으로서 개발자는 영역 확보의 상한을 크게 의식하며 개발하지 않아도 된다는 장점을 가진다.
다만 주의할 점은 자동 확장이 가능하다고 해서 메모리가 무한한 것은 아니며, Metaspace는 Native Memory를 소진하므로 메모리 관리에 실패했을 경우 OS 수준의 문제가 발생할 수 있다는 것을 알아두어야 한다.
Heap 영역
Young(New) Generation
새로 생성한 객체가 사용하는 영역으로 생명 주기가 짧은 객체를 GC 대상(Minor GC)으로 한다. 대부분의 객체가 금방 Unreachable 상태가 되기 때문에, 많은 객체가 Young 영역에서 생성되었다가 사라진다.
- Eden : new를 통해 새로 생성된 객체가 위치. 정기적인 쓰레기 수집 후 살아남은 객체들은 Survivor로 이동한다.
- Survivor 0,1 : S0에서 살아남은 객체는 S1으로 이동하고, S1에서 살아남은 객체는 Old 영역으로 이동한다.
Old Generation
생명 주기가 긴 객체를 GC 대상(Major GC or Full GC)으로 하는 영역으로 Young Gen에서 살아남은 객체가 복사되는 영역으로 Young 영역보다 크게 할당되며, 영역의 크기가 큰 만큼 가비지는 적게 발생한다.
정적인 정보(static)들이 주로 해당 영역에 위치하게 된다.
💡Minor GC와 Major GC, Full GC
Minor GC : Young 영역에서 실행되는 GC. 주로 0.x 초 단위로 작업이 종료된다.
Major GC : Old 영역에서 실행되는 GC. 수초에서 수십초까지 작업이 진행된다.
Full GC : Young, Old 전체 영역에 대한 GC
💡주의할 점
Minor GC에 비해 Major GC와 Full GC 의 작업 시간이 길기 때문에 Major GC와 Full GC 가 자주 일어나게 되면 장애가 발생할 위험이 높으므로 주의하여 설계해야 한다.
Reference.
https://goodgid.github.io/Java-8-JVM-Metaspace/
https://youtu.be/KRzo4PM0AuU?si=64LskI3Q4GcYnnbt
'Backend > JVM' 카테고리의 다른 글
가비지 컬렉션(Garbage Collection, GC)의 알고리즘 (0) | 2023.09.12 |
---|---|
가비지 컬렉션(Garbage Collection, GC)의 작동 원리 (0) | 2023.09.11 |
가비지 컬렉션(Garbage Collection, GC)의 개념 (0) | 2023.09.01 |
JVM 동작 방식 및 메모리 구조(2) (0) | 2023.08.31 |
JVM 동작 방식 및 메모리 구조(1) (0) | 2023.08.30 |