New/Young Generation : minor GC
Old Generation : major GC, Stop-the-world (GC 쓰레드를 제외한 모든 쓰레드가 stop)
Permanent Generation : Method Area ( Major GC 에 포함되는 영역)
Young 영역
객체가 제일 먼저 생성되는 영역이다. Young 영역은 3개의 영역으로 나뉜다.
- Eden 영역
- Survivor 0, Survivor 1 영역 (두 영역 중에 하나는 반드시 비어있는 상태. 그것이 아니라면 비정상적인 상황)
왜 Survivor 영역은 2개일까?
메모리 (외부) 단편화 문제를 해결하기 위함이다. 메모리 할당-해제 과정에서 생기는 메포리 파편화를 해결하기 위해 다른 Survivor 영역으로 옮길 때 외부 fragmentation 을 제거해줍니다.
처리 절차
- 새로 생성한 대부분의 객체는 Eden 영역에 위치
- Eden 영역이 차버리는 시점이 되면 Minor GC 발생 - Eden 영역에서 살아남아있던 객체가 Survivor 영역 중 하나로 이동
- 이후에도 Eden 영역에서 GC가 발생하면 차고 있는 Survivor 영역으로 이동
- Survivor 영역 중 하나가 차버리는 시점이 되면 Minor GC 발생 - 원래의 영역을 비우고 다른 Survivor 영역으로 이동
- 이 과정을 반복하다가 계속해서 살아 남은 객체 - Old 영역으로 이동
Eden 영역에서 객체를 할당하는 방법
- bump-the-pointer : Eden 영역에 제일 마지막으로 할당된 객체를 통해 다음에 할당된 메모리에 대한 next pointer를 가져온다. 이 포인터를 통해 빠르게 메모리 할당을 한다. 그러나 Thread-safe하지 못하여 여러 쓰레드를 사용할 때 lock 이 걸린다.
- TLABs (Thread-Local Allocation Buffers) : Eden 영역의 작은 덩어리에 대해 쓰레드별로 접근하도록 한다. 이를 통해 Thread-safe 하게 객체를 할당할 수 있다.
Old 영역에서 Young 영역의 객체 참조
Old 영역에 카드 테이블이 존재한다. 이 카드 테이블에는 Old 영역에 있는 객체가 Young 영역의 객체를 참조할 때마다 정보가 표시된다.
Young 영역에서 GC가 발생할 때 해당 객체를 Old 영역에서 참조한다면 없애서는 안된다. 이 과정에서 Card table를 확인하면서 Old 영역에서 참조를 하는지 확인한다.
Old 영역의 GC
- Serial GC : mark-sweep-compact 알고리즘. cpu 코어 하나인 상황을 위함
- Parallel GC : Serial GC와 달리 멀티 쓰레드
- Parallel Old GC(Parallel Compacting GC) : mark-sumary-compact 알고리즘. sweep 는 단일 쓰레드, sumarry 는 여러 쓰레드가 old 영역을 분리하여 스캔
참고
https://d2.naver.com/helloworld/1329
'📗Java' 카테고리의 다른 글
[모던자바인액션] 람다 표현식 (1) | 2023.09.14 |
---|---|
[모던자바인액션] 동작 파라미터화 코드 전달하기 (0) | 2023.09.11 |
[Java] 자바 가상 머신 (JVM) 과 GC (1) | 2023.09.06 |
[Java] 쓰레드 동기화 (0) | 2023.08.29 |
[Java] String 클래스 메소드, StringBuffer, StringBuilder (0) | 2023.07.23 |