티스토리 뷰
본 내용은 <자바 최적화> 도서를 참고하여 작성되었습니다.
Runtime Data Area에서 Heap Area(이하 'Heap')를 살펴보자. 자바 프로그램에서 생성된 객체는 이 'Heap'에 생기게 된다. 그런데 이 'Heap'는 한정되어 있고 이를 효율적으로 관리하기 위해 GC가 필요하다. 쉽게 말하면 더 이상 사용하지 않는 객체가 메모리를 차지하지 못하게 버려준다.
이 Heap은 대부분의 객체가 탄생하는 Eden, Survivor1과 Survivor2, Old, Permanent로 구성되어 있다. 이름으로 알 수 있다시피 Eden에서 살아남은 객체는 S1, S2로 이동하게 되고 이후로 Old로 이동하게 된다.
대부분의 객체가 탄생하는 Eden은 각 스레드별로 객체를 할당하는 구역이 나누어져 있다.(계산하려고 줄서있는데 내 카트에 다른 사람의 물건이 들어가는 경우를 생각하면 된다. 이런 경우를 방지하기 위해 구역이 나누어져 있다.) 이 구역을 TLAB(Thread-Local Allocation Buffer)라고 한다.
각 스레드들이 자신의 TLAB에 객체들을 만들다가 더 이상 객체를 만들 공간이 부족해지는 순간이 올 것이다. 이때, Young Generation GC(Young GC)가 발생한다. Young Generation을 상대로 GC를 하는 것인데, 순서는 아래와 같다.
참고로 카드 테이블은 Young과 Old를 이어주는 다리라고 생각하면 된다. Old 객체에서 Young 객체를 참조할 때 그 정보를 기록하고 있다.
여기에서 Survivor1이 객체들로 채워져있고, Survivor2로 살아남은 객체들을 옮기고 Survivor1을 비우는 이런 방법을 반구형 수집이라고 한다.
그리고 가비지가 아닌 객체들을 Mark하고 Mark되지 않은 객체들을 Sweep해서 Mark and Sweep이라고 부른다.
'공부흔적 > 자바' 카테고리의 다른 글
Logback 설정에 관하여 (0) | 2022.02.23 |
---|---|
dead code 원인 찾기 (0) | 2022.01.18 |
API 응답 Json 객체로 받기 (0) | 2021.09.07 |
FileOutputStream의 close와 flush (0) | 2021.08.07 |
File.separator (0) | 2021.07.28 |