본문 바로가기
Java/topic

Java의 GC(가비지 컬렉션)

by Ellery 2022. 10. 30.
  • stop-the-world: GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 작업을 멈춘다.
  • GC는 ‘week generational hypothesis’ 의 2가지 전제조건에 따라 만들어짐
    1. 대부분의 객체는 금방 unreachable한 상태가 된다
    2. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
  • 전제조건에 따라 오라클의 Hotspot JVM은 2가지 물리공간을 나눠 이용한다. Young/old 영역으로 나누는 방식을 Generational GC라고 함
    • Yong generation 영역. 새롭게 생성된 객체들은 이 곳에서 저장됬다가 금방 메모리 해제가 됨. minor GC가 발생한다고 한다
    • Old generation 영역. young 영역에서 오래 살아남으면 Old영역에 복사되고, 더 큰 메모리를 할당한다. 여기서 GC가 발생하면 Major GC, full GC가 일어났다고 한다
    • Old 영역에 대한 GC 방식은 5가지가 있는데 serial GC, parallel GC, Parallel Old GC(parallel Compacting GC), Concurrent Mark& Sweep GC(CMS), G1(Garbage First) GC 가 있다 - 각 GC별 Mark & Sweep 알고리즘의 차이에 대해서 이해할 필요가 있음
    • JDK 1.8 까지는 parallel GC가 default이고, 9 이후부터는 G1 GC가 default이다.
  • 자바의 메모리 영역은 Young, Old, Perm 영역으로 나눈다
    • Young(최근에 저장된 객체가 저장됨. Eden, Survivor 영역으로 나뉨) → minor GC 발생
    • Old(Young area에서 오래 살아남은 객체가 promotion 되서 저장됨) → Full GC 발생
    • Perm: 프로그램 코드가 올라감. Old 영역의 객체와는 별개. → Major GC 발생
  • Old 영역의 객체가 Young 영역의 객체를 참조하는 경우 Card table이라는 공간에 따로 정보를 저장해놓고, 이후에 Young 영역에서 GC를 할 때 이 카드 테이블도 참고해서 GC 대상인지 체크한다. 

참고
- https://d2.naver.com/helloworld/1329
-https://johngrib.github.io/wiki/java-gc-tuning/
-https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/
-https://plumbr.io/blog/garbage-collection/minor-gc-vs-major-gc-vs-full-gc
-https://medium.com/platform-engineer/understanding-java-garbage-collection-54fc9230659a
-https://www.youtube.com/watch?v=FMUpVA0Vvjw