- stop-the-world: GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 작업을 멈춘다.
- GC는 ‘week generational hypothesis’ 의 2가지 전제조건에 따라 만들어짐
- 대부분의 객체는 금방 unreachable한 상태가 된다
- 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재한다.
- 전제조건에 따라 오라클의 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
'Java > topic' 카테고리의 다른 글
모던 자바 인 액션 - 자바8 함수형 인터페이스 정리 (0) | 2023.02.28 |
---|---|
printf() 지시자 정리 (0) | 2022.10.30 |
Java의 Call by value(Pass by value), Swap 구현 방식 4가지 (0) | 2022.10.09 |
자바에서 컬렉션 정렬 시에 사용하는 인터페이스 2가지 - Comparable vs Comparator (0) | 2022.10.09 |
public static void main(String[] args) 의 의미 (0) | 2022.04.26 |