본문 바로가기

CS study/java

JVM 영역의 기본 개념과 GC (24.06.19)

목차

    JVM 영역 정리

    JVM은 크게 여러 메모리 영역으로 나눌 수 있다. 각 영역은 특정 목적을 가지고 있으며, 효율적인 메모리 관리를 위해 사용된다. 주요 메모리 영역은 다음과 같다

     

     

    1. Heap
      • Young Generation
        • Eden Space: 객체가 처음 생성되는 공간이다.
        • Survivor Space: Eden에서 살아남은 객체들이 이동하는 공간이다. S0(Survivor 0)와 S1(Survivor 1) 두 개의 영역으로 나뉜다.
      • Old Generation: Young Generation을 거쳐 오래 살아남은 객체들이 이동하는 공간이다.
    2. Metaspace
      • 클래스 메타데이터를 저장하는 공간이다. JVM 8부터 PermGen이 제거되고 Metaspace로 대체되었다.
    3. Stack
      • 각 스레드마다 별도로 존재하며, 메서드 호출 시 프레임을 저장하는 공간이다.
    4. PC Register
      • 현재 실행 중인 JVM 명령의 주소를 저장한다.
    5. 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 이벤트를 포함한다. 다음은 이에 대한 자세한 설명이다:

    1. Minor GC와 STW
      • Young Generation에서 가비지 수집을 수행한다.
      • Eden과 Survivor 영역의 객체를 처리하며, 살아남은 객체는 Survivor 영역으로 이동하거나 Old Generation으로 승격된다.
      • STW 이벤트가 짧기 때문에 성능에 큰 영향을 주지 않는다.
    2. Major GC와 STW
      • Old Generation에서 가비지 수집을 수행한다.
      • 살아남은 객체를 식별하고 죽은 객체를 제거하는 과정이 더 복잡하고 오래 걸릴 수 있다.
      • STW 이벤트가 길어질 수 있어 애플리케이션의 성능에 큰 영향을 미칠 수 있다.