GC, Garbage Collection은 Java의 메모리 관리 방법 중 하나로 JVM의 Heap 영역에 동적으로 할당되었던 메모리 영역 중 더이상 쓰이지 않는 영역에 대해 주기적으로 삭제를 해주는 프로세스이다. JVM 안에 있으며 이러한 Garbage Collection 덕에 개발자는 메모리 누수(Memory Leak)에 대해 걱정 없이 온전히 개발에 집중할 수 있게 된다.
여기까지가 GC에 대해 내가 알고 있던 부분이다.
어떤 회사의 기술블로그를 읽던 중 GC에 관한 흥미로운 글을 읽게 되었고,
GC에 대해 좀 더 알아보아야겠단 생각이 들어 이 글을 통해 간략하게 정리하고자 한다.
Full GC는 JVM의 Heap 영역 전체를 검사하고 필요 없는 객체들을 삭제한다.
여기서 Heap 영역 전체를 검사한다는 말은, Young GC는 heap 영역 전체를 검사하지 않는다는
얘기인 것 같다. 이를 이해하기 위해서 우선 JVM의 Heap 영역이 내부적으로 어떻게 나뉘어져 있는지를 알아야겠다.
JVM의 Heap 영역은 Young 영역, Old 영역, Perm 영역으로 나뉜다.
Young 영역은 새로운 객체가 할당되는 영역이고,
Old 영역은 Young 영역에서 살아남은 객체들이 저장되는 영역이며,
Perm 영역은 클래스 정보와 메소드 등 메타데이터가 저장되는 영역이다.
검색을 해보니 각각의 영역 마저도 또한 세부적으로 나뉘는 것 같다.
(가령 Young 영역은 Eden 영역과 Survivor 영역으로 다시 나뉘는 것 같다)
그렇다면 Young GC는 당연히 Young 영역만을 검사하여 필요하지 않은 객체를 지워주는 프로세스이고
Full GC는 Old 영역과 Perm 영역을 포함해 Heap 영역 전체를 검사하고 객체를 지워주는 프로세스이다.
Full GC는 Young GC에 비해 더 많은 시간이 소요되기 때문에, Full GC가 발생할 경우 애플리케이션의 성능이 저하될 수 있다고 한다.
해당 내용에서 마지막 내용에 대해 궁금증이 생겼고, 검색 결과 SWT(Stop The World)라는 개념을 알게되었다.
STW(Stop the world)는 GC(Garbage Collection) 과정에서 일어나는 현상으로,
GC 수행 중에 JVM이 애플리케이션의 실행을 일시적으로 중지시키는 것을 의미한다.
STW는 GC 과정에서 발생하는 일종의 부작용으로, 애플리케이션의 실행을 일시적으로 멈추기 때문에, 애플리케이션의 성능에 영향을 미칠 수 있다.
결론적으로 애플리케이션의 성능을 위해서 GC에 대해서도 생각을 해야한다.
(얼마나 지대한 영향을 끼치는지는 모르겠다.)
SWT 시간을 최소화 하기 위해서는 다음과 같은 방법들이 있다.
- GC 튜닝
GC 튜닝을 통해 GC 작업의 빈도와 크기를 최적화하면, STW 시간을 최소화할 수 있습니다.
메모리 할당 크기 조정
메모리 할당 크기를 조정하여, GC 작업이 빈번하게 발생하지 않도록 하면, STW 시간을 줄일 수 있습니다.- 애플리케이션 구조 개선
애플리케이션 구조를 개선하여, 객체의 생성과 소멸을 최소화하면, GC 작업이 덜 발생하여 STW 시간을 줄일 수 있습니다.- GC 로그 분석
GC 로그를 분석하여, 어떤 객체들이 가장 많은 메모리를 차지하고, 어떤 객체들이 더 이상 사용되지 않는지를 파악하여, GC 작업을 최적화할 수 있습니다.- CMS GC 사용
CMS(Garbage First) GC는 Full GC 시간