반응형

1. GC 란?

  • JVM의 Heap 영역에서 사용하지 않는 객체의 메모리를 자동으로 수거하는 기능

 

2. GC의 수거대상

  • Heap 영역에는 Object 타입의 데이터(String, List 등)들이 들어가는데, GC Roots에 UnReachable한 Object가 대상
  • 어떤 객체의 참조가 존재한다면 Reachable, 그렇지 않다면 UnReachable이라고 한다.
  • GC Root에서 시작해 이 Root가 참조하는 모든 오브젝트, 또 그 오브젝트들이 참조하는 다른 오브젝트들을 탐색해 내려가며 마크(Mark)한다.이 탐색해 내려가며 마크하는 것을 Mark단계라고 한다. (Reachable 한 Object)
  • 마크(Mark)되지 않은 객체 (UnReachable한 Object)
  • GC Roots 란?  GC Root들은 힙 외부에서 접근할 수 있는 변수나 오브젝트
    • 실행중인 쓰레드 (Active Thread) 
    • 정적 변수 (Static Variable) 
    • 로컬 변수 (Local Variable) 
    • JNI 레퍼런스 (JNI Reference)

3. GC의 동작순서 (Mark &Sweep)

  • Mark > GC Roots로부터 모든 변수를 스캔하면서 각각 어떤 객체를 참조하는지 찾아서 마킹하는 작업
  • Sweep > 마킹되지 않은 UnReachable한 객체들을 Heap에서 제거하는 작업
  • Compact > Sweep 후에 분산된 객체들을 Heap의 시작주소로 모아 메모리가 할당된 부분, 그렇지 않은 부분으로 나눈다. (메모리 단편화 방지)

 

4. Heap 영역 구조

  • Young Generation (새로운 객체들이 할당되는 영역)
    • Eden
    • Survivor0
    • Survivor1
  • Old Generation (Young Generation에서 오랫동안 살아남은 객체들이 존재하는 영역)
  • meta space (가비지 컬렉션 시에 필요한 클래스와 메소드의 요약 정보가 존재하는 영역)

 

5. GC 동작 과정

  1. 새로운 객체들이 Eden 영역에 할당
  2. Eden 영역이 꽉 찬다
  3. Minor GC 발생 (Mark&Sweep)
    1. Mark > Reachable 한 객체들을 마킹
    2. Reachable 한 객체들은 Survivor 영역으로 이동  (Survivor0 또는 Survivor1 > 한 곳으로만 이동 가능)
    3. UnReachable 한 객체들은 Sweep 처리
    4. Survivor 영역에 있는 살아남은 객체들의 age가 증가한다. (Aging)
  4. 다시 Eden 영역이 꽉 차고, Minor GC가 발생 반복 (1~3번)
  5. 객체 age가 임계점에 도달하면 Old Generation으로 이동한다 (Promotion)
  6. Old Generation이 꽉 차면 Major GC가 일어난다.

 

6. GC 특징

1. stop - the-world

  • GC를 실행하기 위해 jvm이 애플리케이션 실행을 멈추는 것
  • GC를 실행하는 쓰레드 외의 모든 쓰레드가 작업을 중단한다.

2. Minor GC와 Major GC로 나뉘어져 있는 이유 (성능 최적화)

  • 대부분의 객체는 금방 접근 불가능한 상태(unreachable)가 된다. 즉, 금방 garbage가 된다.
  • 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
  • 보통 Minor GC에서 객체들이 수거됨. 빈번하게 발생해도 괜찮도록 구성 (Eden, Survivor)
  • Major GC에서 수거되는 객체들은 미비함.

7. GC의 종류

  • Serial GC
    • GC를 처리하는 쓰레드가 1개
    • 다른 GC에 비해 stop-the-world 시간이 길다.
    • Mark-Complete(Sweep포함) 알고리즘 사용
  • Parallel GC
    • Java8의 default GC.
    • Young 영역의 GC를 멀티 쓰레드로 수행
    • Serial GC에 비해 stop-the-world 시간 감소
  • Parallel GC
    • Parallel GC를 개선
    • Old 영역에서도 멀티 쓰레드 방시의 GC 수행
    • Mark-Summary-Compact 알고리즘 사용
  • CMS GC (Concurrent Mark Sweep)
    • stop-the-world 시간을 줄이기 위해 고안됨
    • compact 과정이 없음

 

References

 

[JAVA] 자바 가비지 컬렉션 , Java Garbage Collection #GC

자바 가비지 컬렉션 , Java Garbage Collection 안녕하세요? 장장스입니다. 자바의 GC에 대해 정리해보겠습니다. GC (Garbage Collection) 자바 어플리케이션은 JVM에 의해 구동이 됩니다. GC(Garbage Collection)는 JVM

zangzangs.tistory.com

 

'개발 > Java' 카테고리의 다른 글

System.out.println() 사용 안하는 이유  (0) 2022.12.14
String, StringBuilder, StringBuffer  (0) 2022.12.13
equals()  (0) 2022.11.30
[자바/JAVA] 정적 변수와 메서드 (static)  (0) 2021.06.25
[자바/JAVA] this  (0) 2021.06.24

+ Recent posts