파비의 매일매일 공부기록

JVM의 GC(Garbage Collection)에 대해 본문

Study/Java

JVM의 GC(Garbage Collection)에 대해

fabichoi 2021. 1. 14. 23:30

Java를 사용한지는 꽤 됐지만

GC에 대해서는 간단한 정의 정도만 알고 있었고

JVM 세팅 할 때마다 '뭔가 어려운건가 보다...' 라고 넘어갔었다.

 

일단 내가 알고 있던 GC의 정의는 다음과 같다.

동적 메모리(힙) 할당 후 프로그래머가 직접 해제 하지 않고 GC라는게 자동으로 해준다.

C/C++ 같이 직접 메모리를 해제 해줄 필요가 없다.

 

그러나 최근에 JVM을 활용하여 Web Server 및 ETL TOOL이

자꾸 OOM(Out of Memory)으로 죽어버려서 GC 설정을 좀 바꿔봐야 해서 관련 서적을 좀 찾아봤다.

 

GC 알고리즘에 따라 조금씩은 다르지만 기본적인 개념을 설명하면

(Serial GC의 경우, 나머지도 비슷한데 Old Generation을 다루는 부분이 차이남)

일단 Young Generation과 Old Generation이라는 Heap 공간이 있고

Young Generation중 eden 영역이 꽉차면 GC(Minor GC)를 수행해서

미사용 Object를 제거하고 사용 Object들이 쌓여서 꽉차면 Old Generation으로 옮긴다.

그러다가 Old Generation의 공간도 꽉차면 GC(Full GC)를 수행한다.

 

문제는 GC가 수행될 때는 모든 애플리케이션 쓰레드가 중지되는데(stop-the-world)

중지되는 시간이 Minor GC는 비교적 짧은 편이고 Full GC는 비교적 긴 편이다.

그렇기에 Full GC가 자주 일어나면(혹은 Old Generation의 공간이 크면) 중지되는 시간이 길어지게 된다.

 

현재 사용 환경의 총 힙 공간은 8G로 되어 있어서

Full GC가 자주 일어날 경우 중지 시간이 길어지면서 발생된 걸로 파악되서(사실 근거는 없다..)

Full GC의 개념이 사라진(?) G1으로 환경 구성을 했다.

 

추후 어찌 진행될지는 한번 모니터링 해 봐야 할 것 같다.

 

그리고 아래 블로그에 각 GC에 대한 좀 더 상세한 설명이 있으니 참조하면 좋을 듯 하다.

d2.naver.com/helloworld/1329

 

반응형
Comments