ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • java: Full GC란?
    Back-End/Java 2024. 12. 22. 15:15
    반응형

    Full GC(Full Garbage Collection)는 Java Virtual Machine(JVM)에서 Heap 메모리 전체를 검사하여 가비지 객체를 회수하는 작업을 의미합니다. 이것은 Java 런타임(JVM)에 의해 관리되는 메모리 정리 작업으로, Spring 프레임워크 자체의 기능은 아니며, Spring은 JVM 위에서 실행되는 하나의 애플리케이션일 뿐입니다.

    1. Full GC란?

    Full GC는 JVM이 Heap 메모리에서 모든 세대(Young, Old, Permanent 혹은 Metaspace)를 스캔하여, 더 이상 참조되지 않는 객체를 정리하는 작업입니다. 이는 메모리를 회수하고 새로운 객체를 저장할 공간을 확보하기 위해 실행됩니다.

     

    Full GC 동작 과정:

    1. Stop-the-World 이벤트:

    Full GC가 실행되면 모든 애플리케이션 스레드가 중단되고, GC 작업이 완료될 때까지 멈춥니다.

    이로 인해 시스템 성능과 응답 속도가 저하될 수 있습니다.

    2. Heap 전체 검사:

    Young Generation(젊은 세대): 주로 단기 객체를 수집.

    Old Generation(노후 세대): 장기 객체를 수집.

    Metaspace 또는 Permanent Generation: 클래스 메타데이터가 저장된 공간도 검사.

    3. 참조되지 않는 객체 제거:

    강한 참조가 없는 객체(가비지)를 모두 회수하고 Heap 공간을 비웁니다.

     

    2. Full GC가 실행되는 조건

     

    Full GC는 다음과 같은 상황에서 트리거됩니다:

    1. Old Generation이 가득 찰 때:

    Old Generation(노후 세대)에 객체가 가득 차고 새로운 객체를 저장할 공간이 없을 때 실행됩니다.

    2. Metaspace 부족:

    Java 8 이상에서는 Metaspace가 가득 찰 경우 Full GC가 실행됩니다.

    3. System.gc() 호출:

    프로그래머가 System.gc()를 호출하면 강제로 Full GC가 발생합니다.

    4. JVM 내부 정책:

    특정 GC 알고리즘(G1GC, CMS 등)의 조건에 따라 실행됩니다.

     

    3. Spring과 Full GC의 관계

     

    Spring 프레임워크 자체는 GC를 제어하지 않습니다. 하지만 Spring 애플리케이션이 메모리를 많이 사용하거나 객체 생명 주기를 적절히 관리하지 않으면, Full GC가 더 자주 발생할 수 있습니다.

     

    Spring에서 Full GC가 관련될 수 있는 경우:

    Bean 라이프사이클:

    Spring은 Bean을 생성하고 주입하는 과정에서 많은 객체를 메모리에 로드합니다. Bean 범위(scope)가 singleton 이외의 경우, 필요 이상으로 객체가 생성되고 관리되지 않으면 메모리 문제가 생길 수 있습니다.

    캐싱:

    Spring Cache를 사용할 때, 캐시 객체가 너무 많이 쌓이면 메모리 부족이 발생할 수 있습니다.

    대용량 데이터 처리:

    REST API나 배치 작업 등에서 대량의 데이터를 처리할 때 메모리 누수가 발생하면 Full GC가 자주 실행될 가능성이 높아집니다.

     

    4. Full GC의 문제점

     

    Full GC는 메모리를 정리하기 위한 중요한 과정이지만, 성능 저하를 유발할 수 있습니다.

     

    문제점:

    1. Stop-the-World:

    Full GC 동안 모든 애플리케이션 스레드가 멈춥니다.

    사용자 응답 시간이 길어지고, 애플리케이션이 일시적으로 멈춘 것처럼 보일 수 있습니다.

    2. CPU 사용량 급증:

    Full GC는 많은 계산 작업을 수행하므로 CPU 사용량이 급격히 증가합니다.

    3. 자주 발생하면 시스템 불안정:

    Full GC가 반복적으로 발생하면 애플리케이션 성능이 저하되고, 최악의 경우 OutOfMemoryError(OOM)가 발생할 수 있습니다.

     

    5. Full GC 로그 확인

     

    JVM 옵션을 통해 Full GC 로그를 확인할 수 있습니다:

    # GC 로그 활성화
    -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log

     

    예시 로그:

    2024-12-22T14:34:12.123+0000: [Full GC (Allocation Failure) [PSYoungGen: 512K->0K(1024K)] [ParOldGen: 10240K->8192K(10240K)] 10752K->8192K(11264K), [Metaspace: 2048K->2048K(2048K)], 0.0456789 secs]

     

    6. Full GC 문제를 줄이기 위한 방법

    1. 메모리 사용량 최적화:

    불필요한 객체 생성을 줄이고, 객체의 생명 주기를 명확히 관리합니다.

    Spring에서는 프로토타입(Prototype) Bean을 남발하지 않도록 주의하세요.

    2. JVM GC 설정 변경:

    최신 GC 알고리즘을 사용합니다:

    -XX:+UseG1GC  # G1 GC 사용

    GC 임계값을 조정하여 Full GC 빈도를 줄입니다:

    -XX:InitiatingHeapOccupancyPercent=70  # Old Gen 70%에서 GC 시작

    3. 캐시 관리:

    Spring Cache에서 오래된 데이터나 불필요한 데이터를 주기적으로 제거합니다.

    4. 배치 작업 최적화:

    배치 작업에서 메모리를 한 번에 많이 사용하는 경우, 데이터 처리량을 나누어 관리합니다.

     

    7. 결론

     

    Full GC는 JVM이 메모리 관리를 위해 필수적으로 수행하는 작업이지만, 잘못된 메모리 사용 습관과 애플리케이션 설계로 인해 자주 발생하면 성능 저하를 초래할 수 있습니다. Spring 자체는 GC를 수행하지 않지만, 메모리 사용 패턴에 영향을 미칠 수 있으므로 적절한 Bean 라이프사이클 관리와 메모리 사용량 최적화가 필요합니다.

     

    Full GC가 자주 발생한다면 Heap Dump와 GC 로그를 분석하여 문제를 정확히 파악하고, JVM 옵션을 통해 GC 정책을 튜닝하세요.

    반응형
Designed by Tistory.