아무거나

Garbage Collection (요약정리본) 본문

Java/Java

Garbage Collection (요약정리본)

전봉근 2022. 7. 27. 14:57
반응형

Garbage Collection 기존글: https://bkjeon1614.tistory.com/249

 

GC(=Garbage Collection)

  • 불필요한 또는 더이상은 사용하지 않는 객체들을 메모리에서 제거함으로써 Java 프로세스가 한정된 메모리를 효율적으로 사용할 수 있게 해준다.
  • JVM Heap 구조

  • 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 된다. 
  • // 10,000 건의 NewObject 객체는 Loop 내에서 생성되고, 사용되지만 Loop 밖에서는 더이상 사용할 일이 없어진다. 이런 객체들이 메모리를 계속 점유하고 있다면, 다른 코드를 실행하기 위한 메모리 자원은 지속적으로 줄어들기만 할 것이다. // GC는 이렇게 한번쓰이고 버려지는 객체들 즉, 접근 불가능 상태가 된 객체를 주기적으로 비워줌으로써 한정된 메모리를 효율적으로 사용할 수 있게 해준다. for (int i = 0; i < 10000; i++) { NewObject obj = new NewObject(); obj.doSomething(); }
  • GC가 일어나는 과정

  • 처음 생성된 객체 new Model(); 는 Young Generation 영역의 일부인 Eden 영역에 위치하게된다. 그리고 Minor GC가 발생하게 되면, 사용하지 않는 다시말하면 다른 곳에서 참조되지 않는 객체는 메모리에서 제거된다.
  • Eden 영역에서 살아남은 객체는 Young Generation 영역의 또다른 일부인 Survivor 영역으로 이동하게된다. Survivor 영역은 Survivor1 영역과 Survivor2 영역으로 구성되어 있는데, Minor GC가 발생할 때마다 Survivor1 영역에서 Survivor2 영역으로 또는 Survivor2 영역에서 Survivor1 영역으로 객체가 이동하게되며, 이 과정에서 더이상 참조되지 않는 객체는 메모리에서 제거된다.
  • Minor GC가 발생하는 동안 Survivor1, Survivor2 영역을 오가며 살아남은 객체들은 최종적으로 Old Generation 영역으로 옮겨지며, Old Generation 영역에 있다가 미사용된다고 식별되는 객체들은 Major GC(=Full GC)를 통해 메모리에서 제거된다.
  • GC 종류
    • Serial GC: MinorGC, MajorGC를 순차적으로 진행
    • Parallel GC: 여러 CPU를 효율적으로 활용하기 위해 GC 수행시 멀티쓰레드를 사용
    • CMS Collector: 가비지 컬렉션 작업을 애플리케이션 쓰레드와 동시 수행하여 Stop the World 시간을 최소화
    • G1 GC: 여러 CPU와 아주 큰 Memory에서 효과적인 GC를 수행하기 위해 사용
  • 종류별 설명
    • 일반적으로 CMS Collector 가 Parallel Collector 보다 속도가 빠름
    • Parallel Collector 는 Full GC 마다 메모리 단편화 제거 작업을 수행하지만 CMS Collector 는 Concurrent mode failure 경고가 발생할 때만 메모리 단편화 제거 작업을 수행할 수 있다.
    • Stop The World: MinorGC 발생시 발생하며 모든 애플리케이션의 쓰레드가 중지하고 예외는 없다.
    • MinorGC: Young Generation 영역을 정리하는 것. 새로 생성된 객체는 Eden 영역에 위치한다. Eden 영역에서 GC가 한번 발생한 후 살아남은 객체는 Survivor 영역 중 하나로 이동된다. 이 과정을 반복해서 살아남는 객체는 일정시간 참조되고 있다는 뜻으로 Old 영역으로 이동한다.
    • MajorGC(=Full GC): Old Generation 영역을 정리하는 것. Old 영역에 있는 모든 객체들을 검사하여 참조되지 않는 객체들을 한꺼번에 삭제한다.
반응형
Comments