JVM의 Heap영역에서 사용하지 않는 객체를 삭제하는 프로세스 입니다.
GC가 주기적으로 사용하지 않는 객체를 삭제해 줘서 자바는 메모리를 효율적으로 사용할 수 있게 됩니다.
사용하지 않는다고 판단되는 객체를 알아서
없애주기 때문에 프로그래머는 이를 신경쓰지 않아도 됩니다.
대신 GC의 대상이 되는 객체를 프로그래머가 임의로 메모리에서 삭제하는 것도 불가능합니다.
???: 엄마 저번에 내방에 있던 그거 어디갔어
GC: 그거 니가 안쓰길래 엄마가 버렸어
???: 엄마 이거 잘 안쓰는거 같은데 버릴까?
GC: 엄마가 알아서 버릴께 너는 이런거 신경쓸 시간에 공부나 해
어떤 객체에 유효한 참조가 존재한다면 Reachable, 그렇지 않다면 Unreachable하다고 표현합니다.
GC Roots에서부터 참조가 유효한지 검사합니다.
GC Roots가 될 수 있는 것들
GC Roots가 참조하는 Object에 의해 참조되고 있는 다른 Object도 Reachable한 상태입니다.
GC Root로부터 모든 변수를 스캔하면서 Reachable한지, Unreachable한지를 판단합니다.
Unreachable한 객체를 힙에서 제거합니다.
Sweep후에 듬성듬성 남아있는 객체들을 Heap의 앞쪽으로 밀어 메모리가 할당된 부분과 그렇지 않은 부분의 경계를 명확히 나눕니다.
알고리즘에 따라 Compact과정은 없기도 합니다.
Compact로 인해 Stop-the-world가 발생합니다.
힙은 크게 Young Generation
, Old Generation
, 그리고 meta space
영역으로 구분됩니다.
에덴
,서바이버0
,서바이버1
공간으로 나뉩니다.특정 공간이 다 차면 GC가 실행됩니다.
Eden이 다 차면 발생(Minor GC)
Survivor가 다 차면 발생(Minor GC)
Old generation이 다 차면 발생(Major GC)
Minor GC
가 발생합니다.Major GC
가 발생합니다.메모리 단편화란 RAM에서 메모리의 공간이 작은 조각으로 나뉘어져 사용 가능한 메모리가 충분히 존재하지만 할당이 불가능한 상태를 말합니다.
GC과정에서 survivor영역을 옮겨다니면 공간이 정리되기 때문에 단편화를 해결할 수 있습니다.
compact vs survivor01에 옮겨담기 차이가 뭘까?
GC 설계자들이 다음 두 가지를 가정했기 때문입니다.
1) 대부분의 객체는 금방 접근 불가능한 상태(unreachable)가 된다.
2) 오래된 객체에서 젊은 객체로의 참조는 아주 드물게 나타난다.
GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것을 말합니다.
Stop-the-world가 발생하면 가비지 컬렉터를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춥니다.
가비지 컬렉터 작업이 완료되면 멈췄던 쓰레드들이 다시 실행됩니다.
GC의 성능향상 방법으로는 크게 Young 영역과 Old 영역의 힙 크기를 알맞게 조정하는 방법
과 객체의 할당이나 Survivor영역,Old영역으로의 이동을 줄이는 방법
이 있습니다.
새로운 배열에 옮겨담는
방식이기 때문에 이전 배열은 가비지 상태가 되어버립니다.GC를 처리하는 쓰레드가 1개(싱글 쓰레드)
다른 GC에 비해 stop the world시간이 길다
Mark-Compact 알고리즘 사용
Serial GC를 개선
java8의 default GC
Minor GC를 멀티 쓰레드로 수행
Serial GC보다 stop the world시간이 짧다
Parallel GC를 개선
Major GC도 멀티 쓰레드로 수행
Mark-Summary-Compact 알고리즘을 사용
Reachable한 객체를 한번에 찾지 않고 순차적으로 찾는 게 특징
GC를 처리하는 쓰레드는 하나지만 나머지 쓰레드들은 작업을 계속 진행하고 있음
compact 과정이 없음 -> 메모리 단편화 문제가 살짝 아쉬움
CMS GC를 개선
java9이상의 default GC
Heap영역을 (YG,OG로 물리적으로 나누지 않고)일정한 크기의 Region으로 나눔
전체 Heap이 아닌 할당된 Region에 대해서만 Marking을 함(Region단위로 탐색함)
Garbage만 있는 Region을 수거해 감
compact 과정이 있음
GC종류에 대한 상세한 설명은 여기에서 진행하겠습니다.