가비지 컬렉터는 더이상 참조되지 않는 메모리인 가비지를 청소해주는 JVM의 실행 엔진의 한 요소이다. JVM은 new와 같은 연산에 의해 새롭게 생성된 객체들 중에서 더이상 참조되지 않는 객체를 정리하는데 힙 영역의 메모리를 정리한다. 가비지 컬렉션은 메모리를 정리하는 과정이다.
가비지 컬렉션은 힙 영역의 메모리를 정리하는 과정이기 때문에 메모리를 중단한 채로 진행이 되어야 한다. 그래서 Jvm은 GC를 하기 위해 애플리케이션 실행을 멈추는 stop-the-world를 먼저 실행하고 GC를 실행하는 쓰레드를 제외한 나머지 쓰레드는 작업을 멈춘다.
1) Heap은 Young generation과 Old generation으로 나뉜다. Young generation은 Eden/Survival 0/Survival 1로 세분화된다.
2) GC의 작업은 Young 영역에 대한 Minor GC와 Old 영역에 대한 Major GC로 구분한다.
3) 새로운 객체는 Eden 영역에 생성되고 Eden 영역이 가득차면 Minor GC가 발생되는데 Reference 관계가 없다면 Unreachable Object로 판단하고 eden 영역이 클리어되면 메모리 해제되며 그 외 Reachable Object는 Survival 0으로 이동된다.
4) 기존 Survival 0에 있던 Reachable Object는 Survival 1로 이동된다. Survival 1이 가득차면 Reachable Object들은 Old generation으로 복사된다.
5) Old 영역이 가득차서 Survivor 영역에서 Old 영역으로 Promotion이 불가능할 때 Old 영역에 대한 GC(Major GC)가 실행된다.
Java 8에서 JVM은 Permanent Generation 메모리 영역이 없어지고 Metaspace 영역이 생겼다. 그리고 다음과 같은 변화가 생겼다. (PermGen은 클래스 메타 데이터를 담는 영역으로 Heap 영역에 속했고, 제한된 크기를 가지고 있었다.)
1) Class의 Meta 정보 -> Metaspace 영역으로 이동
2) Method의 Meta 정보 -> Metaspace 영역으로 이동
3) Static Object -> Heap 영역으로 이동
4) 상수화된 String Object (String str = "hello";) -> Heap 영역으로 이동
5) 클래스와 관련된 배열 객체 정보 -> Metaspace 영역으로 이동
6) Jvm 내부 객체와 최적화 컴파일러의 최적화 정보 -> Metaspace 영역으로 이동
static List<Object> list = new ArrayList<>();
1) 옵션을 변경하여 GC 성능 높이기
2) 설정을 변경하여 GC 성능 높이기
3) 코드를 변경하여 GC 성능 높이기
*참고 자료
https://code-factory.tistory.com/48
https://velog.io/@hygoogi/%EC%9E%90%EB%B0%94-GC%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C