GC

아빠는 외계연·2023년 10월 24일
0

Study

목록 보기
11/11
post-custom-banner

GC

  • Stop The World

    • GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것
    • GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 실행을 멈춘다.
    • GC튜닝은 해당 시간을 줄이는 것
  • Mark 과정

    • 힙 내의 다른 객체들의 참조
    • Java 스택 참조
    • 네이티브 스택 참조
    • 메서드 영역 참조
      • → 하위 세개가 Root Set → Reachability를 판가름
  • Young영역

    • 새롭게 생성한 객체의 대부분이 여기에 위치
    • 매우 많은 객체가 Young영역에 생성되었다가 사라진다.
    • Minor GC
      • bumper-the-pointer
        • 맨 마지막 객체의 사이즈를 체크 후 들어가기 적당한지 체크
        • Eden 영역의 락 → 성능 하락
      • TLABs(Thread-Local Allocation Buffers)
        • 위의 방법의 개선
        • 멀티 쓰레드 환경에서 유용
        • 각 쓰레드가 Eden 영역의 작은 덩어리를 가지고 있음 → lock안걸어도됨
    • Eden
    • Survivor영역-2개
      • 하나의 Survivor 영역이 가득 차면 다른 Survivor 영역으로 이동(임계값 8)
      • Survivor 영역 중 하나는 반드시 비어있어야 한다.
  • Old 영역

    • Young 영역에서 살아남은 객체가 여기로 복사된다.

    • Young 영역보다 크게 할당, 크기가 큰만큼 GC는 적게 발생한다.

    • Full GC가 발생

    • 종류

      • Serial GC(싱글 스레드)

        • mark-sweep-compact 알고리즘 사용
        • GC 를 처리하는 쓰레드가 하나
      • Parallel GC(멀티 스레드 - JAVA8 default)

        • GC를 처리하는 쓰레드가 여러개
        • 메모리가 충분하고 코어의 개수가 많을 때 유리
      • Parallel Old GC

        • mark-summary-compaction방법
          • 효율을 위해 앞선 GC에서 compaction된 영역을 별도로 훑는다.
      • Concurrent Mark & Sweep GC(CMS)

        • Initial Mark > 클래스 로더에서 가장 가까운 객체 중 살아있는 객체만 찾는 것으로 끝난다.
        • Concurrent Mark > 살아있다고 확인한 객체에서 참조하고 있는 객체들을 따라가면서 확인
          • 다른 스레드가 실행중인 상태에서 동시에 진행
        • Remark
          • Concurrent Mark 단계에서 새로 추가되거나 참조가 끊긴 객체를 확인
        • Concurrent Sweep
          • 쓰레기를 정리하는 작업 진행
          • Stop the world시간이 매우 짧다
          • 단점
            • 메모리, CPU를 많이 사용
            • Compaction단계 기본 제공X
              • 조각난 메모리가 많아 Compaction실행 시 더 많이 걸린다.
      • G1 GC(Java 9)

        • Old, Young영역 구분이 모두 사라짐
  • Permanent Generation(Perm 영역) = Method Area

    • 객체나 억류된 문자열 정보를 저장
    • Old 영역에서 살아남은 객체가 영원히 남아있는 곳은 아님
    • GC가 발생 시 Major GC횟수에 포함
  • Mark and Sweep 프로세스 사용

    • 의도적으로 GC를 실행시켜야 한다.
    • 어플리케이션 실행과 GC가 병행된다.
    • 살려놔야 하는 모든 객체에 대해 Mark 표시를 한 뒤 Mark 표시가 없는 객체들은 모두 정리
    • JVM 스택에서 도달할 수 없는 것들이 대상이 됨
    • Root Set부터 그래프 구조를 순회하면서 Reachable Object를 체크

Serial Collector

  • 하나의 CPU를 사용
  • 단일 스레드 환경을 위한
  • Young, Old영역이 시리얼(연속적으로)하게 처리 → Stop - the - world라고 표현
  • Mark-Sweep-Compact

Parallel Collector

  • 멀티 CPU환경에서 사용되는 GC
  • JAVA 8 사용시 기본 GC
  • Young 영역에서의 콜렉션을 병렬로 처리
profile
Backend Developer
post-custom-banner

0개의 댓글