CS study/java
JVM 영역의 기본 개념과 GC (24.06.19)
블랑v
2024. 10. 1. 05:08
JVM 영역 정리
JVM은 크게 여러 메모리 영역으로 나눌 수 있다. 각 영역은 특정 목적을 가지고 있으며, 효율적인 메모리 관리를 위해 사용된다. 주요 메모리 영역은 다음과 같다
- Heap
- Young Generation
- Eden Space: 객체가 처음 생성되는 공간이다.
- Survivor Space: Eden에서 살아남은 객체들이 이동하는 공간이다. S0(Survivor 0)와 S1(Survivor 1) 두 개의 영역으로 나뉜다.
- Old Generation: Young Generation을 거쳐 오래 살아남은 객체들이 이동하는 공간이다.
- Young Generation
- Metaspace
- 클래스 메타데이터를 저장하는 공간이다. JVM 8부터 PermGen이 제거되고 Metaspace로 대체되었다.
- Stack
- 각 스레드마다 별도로 존재하며, 메서드 호출 시 프레임을 저장하는 공간이다.
- PC Register
- 현재 실행 중인 JVM 명령의 주소를 저장한다.
- Native Method Stack
- 네이티브 메서드(일반적으로 C/C++로 작성된 코드)의 호출 정보를 저장하는 공간이다.
PS MarkSweep와 PS Scavenge
Parallel Scavenge (PS Scavenge)
- Young Generation에서의 GC 방식이다.
- 멀티 스레드를 이용하여 Eden과 Survivor Space에서의 가비지 수집을 병렬로 처리한다.
- Stop-the-world 방식을 사용하여 모든 애플리케이션 스레드를 일시 중지시킨 후 가비지 수집을 수행한다.
PS MarkSweep
- Old Generation에서의 GC 방식이다.
- 객체가 어느 정도 나이가 들어 Old Generation으로 이동했을 때, 해당 영역에서 가비지 수집을 수행한다.
- 마킹 단계에서 살아 있는 객체를 식별하고, 스위핑 단계에서 죽은 객체를 제거한다.
- Stop-the-world 방식을 사용하며, 상대적으로 긴 시간 동안 애플리케이션 스레드가 중지될 수 있다.
예시 코드
java코드 복사
public class GCDemo {
public static void main(String[] args) {
// 많은 객체를 생성하여 Eden 공간을 채운다
for (int i = 0; i < 10000; i++) {
byte[] b = new byte[1024];
}
// Old Generation으로 객체 이동
for (int i = 0; i < 100; i++) {
byte[] b = new byte[1024 * 1024];
System.gc(); // 명시적으로 GC 호출
}
}
}
위의 코드에서 for 루프는 많은 객체를 생성하여 Eden Space를 빠르게 채운다. 이때 PS Scavenge가 발생하여 Young Generation에서 가비지 수집이 이루어진다. 이후 Old Generation으로 객체가 이동하면서 필요에 따라 PS MarkSweep이 수행될 수 있다.
정리
- PS Scavenge는 Young Generation에서 가비지 수집을 수행하며, 짧은 시간 동안의 Stop-the-world를 특징으로 한다.
- PS MarkSweep는 Old Generation에서 가비지 수집을 수행하며, 상대적으로 긴 시간 동안의 Stop-the-world를 유발할 수 있다.
- 두 방식 모두 JVM의 효율적인 메모리 관리를 위해 필수적이다.
Stop-the-world
Parallel Scavenge(PS Scavenge)가 Minor GC로 동작하는 것은 맞다. 그리고 Minor GC도 Stop-the-World(STW) 이벤트를 발생시킨다. 이는 JVM의 모든 애플리케이션 스레드를 일시 중지시키고 가비지 수집 작업을 수행하는 것이다.
Minor GC와 Stop-the-World
Minor GC (PS Scavenge)
- Minor GC는 Young Generation에서 발생하며, 대부분의 객체가 이 영역에서 생성되고 소멸된다.
- Minor GC는 STW 이벤트를 발생시킨다. 이 말은, Minor GC가 수행되는 동안 모든 애플리케이션 스레드가 중지된다는 뜻이다.
- Minor GC는 일반적으로 매우 빠르게 완료된다. 왜냐하면 대부분의 객체가 Young Generation에 생성된 후 곧바로 수집되기 때문이다.
Major GC (PS MarkSweep)
- Major GC는 Old Generation에서 발생하며, Young Generation에서 생존한 객체들이 오래 남아 있을 때 수행된다.
- Major GC도 STW 이벤트를 발생시킨다. 하지만 Minor GC와 비교해서 더 오래 걸릴 수 있다.
- Major GC가 수행되는 동안 전체 힙 메모리가 영향을 받으며, 이로 인해 애플리케이션 응답 시간이 길어질 수 있다.
Stop-the-World와 GC 종류
STW 이벤트는 GC의 일종이 실행될 때마다 발생하며, 이로 인해 JVM은 모든 애플리케이션 스레드를 중지시킨다. Minor GC와 Major GC 모두 STW 이벤트를 포함한다. 다음은 이에 대한 자세한 설명이다:
- Minor GC와 STW
- Young Generation에서 가비지 수집을 수행한다.
- Eden과 Survivor 영역의 객체를 처리하며, 살아남은 객체는 Survivor 영역으로 이동하거나 Old Generation으로 승격된다.
- STW 이벤트가 짧기 때문에 성능에 큰 영향을 주지 않는다.
- Major GC와 STW
- Old Generation에서 가비지 수집을 수행한다.
- 살아남은 객체를 식별하고 죽은 객체를 제거하는 과정이 더 복잡하고 오래 걸릴 수 있다.
- STW 이벤트가 길어질 수 있어 애플리케이션의 성능에 큰 영향을 미칠 수 있다.