힙 영역을 탐색해 어떤 객체들이 사용중인지 아닌지를 구별하고 사용하지 않는 객체들을 제거하는 과정
사용중인 객체 또는 참조된 객체란 당신의 프로그램중 어떤 부분이 그 객체를 가리키는 포인터를 가지고있다는 뜻이다.
C언어같은 경우 메모리 할당과 해제를 사용자가 할 수 있지만 자바에서 메모리 해제는 GC에 의해 자동적으로 이뤄진다.
gc가 메모리 어떤 부분이 사용중인지 아닌지 확인한다.
참조된 객체들은 파란색, 아닌 객체들은 주황색으로 표시
모든 객체들이 marking 단계에서 스캔되어 이러한 결정이 정해진다.
시스템 안의 모든 객체들이 스캔되어야 할 경우 이것은 매우 시간이 오래 걸리는 과정이 될 수 있다.
참조 된 개체와 여유 공간에 대한 포인터를 남겨두고 참조되지 않은 개체를 제거한다.
메모리 할당자는 빈 공간들의 레퍼런스를 리스트로 관리하고 할당이 필요할 때마다 이 리스트를 검색한다.
향상된 퍼포먼스를 위해 참조되지 않은 객체들을 제거하고 남겨진 참조된 객체들을 압축시킨다. 참조된 객체를 옮김으로
새로운 메모리 할장을 더욱 쉽고 빠르게 할 수 있게 된다.
1에서 말했듯이 JVM의 모든 객체들을 MARK하고 COMPACT하는 것은 비효율 적이다.
많은 객체들이 할당될수록 객체들의 리스트는 증가하고 증가는 GC 시간을 승가시킨다.
그러나 경험적 분석에 따르면 대부분의 객체들은 짧은 시간동안만 생존해있는다.
객체 할당 행동으로부터 배운 정보로 JVM 퍼포먼스 향상에 도움을 줄 수 있다.
그러므로 힙 영역을 더 작은 영역 또는 세대로 나눈다. ( young generation, old generation, permanent generation )
새로운 모든 객체들이 할당되고 나이를 먹는 곳이다. yg가 모두 차면, 이것은 minor garbage collection을 일으킨다
높은 객체 사망률을 가정함으로써 최적화 될 수 있다. 죽은 객체들로 가득 찬 young generation은 매우 빠르게 collect된다
몇몇의 생존한 객체들은 나이를 먹고 결국 old generation으로 옮겨간다.
모든 minor garbage collections은 STOP THE WORLD 이벤트이다.
모든 어플리케이션 쓰레드들이 collect operation이 완료될 때까지 멈춘다는 뜻이다.
minor garbage collection은 언제나 "STOP THE WORLD" 이벤트이다
오래 생존한 객체들을 저장하기 위한 공간이다.
보통 young generation 객체를 위해 역치가 설정되고 이 역치를 넘기면 객체는 old generation으로 옮겨간다.
결국 old generation도 collect되어야 한다. 이 이벤트를 major garbage collection이라고 한다.
minor와 같이 stop the world 이벤트이다.
종종 major collectino이 훨씬 느린데 모든 살아있는 개체들이 포함되어 있기 때문이다.
따라서 반응 형 애플리케이션의 경우 주요 가비지 컬렉션을 최소화해야한다.
major collection을 위한 stop the world 이벤트의 길이는 old generation 공간에 사용되는 garbage collector의 종류에 의해 영향을 받는다.
JVM이 어플리케이션에서 사용되는 클래스들과 메소드들을 설명하기 위해 필요한 메타데이터를 포함한다.
런타임시 어플리케이션에 의해 사용되는 클래스를 베이스로 JVM에 의해 채워진다.
자바 SE 라이브러리 클래스들과 메소드들이 이곳에 저장될 수 있다.
JVM이 어떤 클래스들이 더이상 필요하지 않고 다른 클래스들을 위한 공간이 필요함을 찾아냈을 때 그 클래스들은 collect(unloaded)될 수 있다.
permanent generation은 full garbage collection에 포함된다.
이제 왜 힙 영역이 왜 다른 세대들로 구분되어야하는지 이해했을 것이다.
어떻게 이 공간들이 상호작용하는지 알아보자
다음 사진은 JVM에서 객체 할당과 aging 프로세스가 어떻게 이뤄지는지 보여준다
출처 : https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html