기본 콘텐츠로 건너뛰기

2월, 2016의 게시물 표시

JVM Garbage Collector 종류와 동작방식

시스템이 운영되다 보면 성능개선을 해야 할 때가 생긴다. 새로 코드를 구현하는 방법이 제일 좋겠지만 가비지 컬렉터(Garbage Collector)를 튜닝 하는 것도 성능개선에 많은 도움이 된다. 튜닝을 경험해볼 일은 없어보이지만 평소 모호하게 알고있었던 내용이기도 해서 JVM가비지 컬렉터 종류와 어떤 일을 하는지 정도를 정리해 둠.


GC 개요
GC는 더이상 사용되지 않는 객체를 찾는 작업과 메모리에서 제거하는작업으로 나뉘는데, JVM은 더는 참조되지 않는객체를 찾아 메모리에서 제거하는 작업을 할 때 힙(heap)을 주기적으로 검색한다. 그런 후 GC 대상이 되는 객체가 차지했던 메모리를 다른 객체가 쓸 수 있게 메모리에서 비우게 된다. 이때 Compacting이라는 작업도 함께 이루어진다. Compacting은 메모리 파편화(memory fragmentation)가 생기지 않게 남은 공간을 잘 합쳐두는것을 말한다.

Stop-the-world 자바는 멀티 쓰레드 환경인데 쓰레드는 어플리케이션에서만 쓰는것이 아니라 GC도 특정 쓰레드에서 실행이 된다. GC 쓰레드가 동작할 때는 모든 애플리케이션 쓰레드는 동작을 멈춘다. 때문에 Full GC가 생기면 시스템이 멈추게 된다. 그렇기 때문에 GC가 동작될때 애플리케이션 쓰레드가 멈추는 시간을 최소화하는 것이 GC 튜닝의 기본이라고 한다.

Young Generation과 Old Generation 가비지 컬렉터는 Young Generation과 Old Generation으로 나눠서 작업한다.(Young Generation은 또 edan영역과 survivor영역으로 나뉜다) 이렇게 나누는 이유는 GC 시간을 최소화 하는것과 관련이 있다. 처음에 객체는 Young Generation에 할당된다. Young Generation이 가득차면 가비지 컬렉터가 애플리케이션 쓰레드를 멈추고 사용되지 않는 객체를 찾아 Young generation에서 제거한다. 이 과정을 Minor GC라 한다.


자바 코딩을 할 때 일반적으로 아래와 …