BackEnd

Java Garbage Collection

SambaLim 2019. 9. 20. 00:13
JVM_Garbage_Collection

현재 배포하고있는 Spring Project에서 GC관련 이슈가 발생하여 이를 해결하기 위해 GC에 대해 정리합니다.

 

Garbage Collection

Garbage Collection은 더 이상 유효하지 않은 주소(Dangling Pointer)를 정리해주는 프로그램을 의미합니다.

JVM 상에서 Java Application을 실행하다보면 주소를 잃어버려서 사용할 수 없는 메모리가 생긴다. 이를 Garbage라고 하는데, 이 메모리들은 사용하지는 않지만 메모리에서 공간을 차지하고 있게 됩니다. 이 공간을 다시 사용할 수 있도록 해소해주는 역할을 하는 것이 Garbage Collection입니다.

Stop-the-world

말그대로 Garbage Collection을 실행시키기 위해, JVM에서 돌고있는 Java Application을 정지하는 것을 이야기합니다. stop-the-world가 발생할 경우, Garbage Collection을 위한 쓰레드를 제외하고 모든 작업지 정지됩니다.

Java에서는 일반적으로 메모리해소작업을 직접 하지 않습니다. 물론 System.gc()를 호출하거나 JDK12에서 추가된 java.lang.ref패키지를 통해서 GC와 상호작용을 하기도 합니다.

 

Reachability

Garbage Collection은 객체가 Garbage인지 판별하기 위해 reachability라는 개념을 사용합니다. 객체가 유효한 참조가 있는 경우 reachable, 없는 경우 unreachable 로 구분합니다. 이 때, 참조 여부를 파악하기 위해 항상 유효한 참조인 root set을 사용합니다.

Heap내에 있는 객체들의 참조는 4가지 분류가 있는데

① 힙 내의 다른 객체에 의한 참조

② Java 스택, 즉 Java 메서드 실행 시에 사용하는 지역 변수와 파라미터들에 의한 참조

③ 네이티브 스택, 즉 JNI(Java Native Interface)에 의해 생성된 객체에 대한 참조

④ 메서드 영역의 정적 변수에 의한 참조

이들 중 '① 힙 내의 다른 객체에 의한 참조'외의 3가지가 root set으로 reachability를 판가름하는 기준이 됩니다.

 

Generational Garbage Collection

Garbage Collection의 과정을 알기 위해서는 weak generation hypothesis라는 가설을 알아야 합니다.

① 대부분의 객체는 금방 unreachable이 된다.

② 오래된 객체에서 생성된지 얼마안된 객체로의 참조는 적다.

weak generation hypothesis 가설을 바탕으로 HotSpot VM에서는 Young 영역Old 영역으로 물리적인 공간을 나눕니다.

Young 영역

생성된지 얼마 안된 객체 혹은 생명 주기가 짧은 객체가 대부분 Young 영역에 위차합니다. Young영역에서 발생하는 Garbage Collection을 Minor GC라고 합니다.

Old 영역

Young 영역에서 Garbage Collection에서 남은 객체가 복사되어 위차합니다. 일반적으로 Old 영역을 Young영역보다 크게 할당합니다. 크기가 큰 만큼 Young 영역보다 Garbage Collection이 적게 발생합니다. 이 영역에서 발생하는 Garbage Collection을 Major GC 혹은 Full GC라고 합니다.

Permanent 영역(Method Area)

객체나 억류(intent)된 문자열 정보를 저장하는 곳입니다. 이 영역에서 Garbage Collection이 발생할 경우에도 Major GC의 횟수에 포함합니다.

 

공식 문서

 

참고자료