도서

자바 성능을 결정짓는 코딩 습관과 튜닝이야지 [Story 02]

까망수염 2012. 4. 4. 11:12
728x90

도대체 GC는 언제 발생할까?

  • GC란?

 GC는 Garbage Collection의 약자이다. 하는 역할은 더 이상 참조되지 않는 객체(쓰레기 객체)

를 수집하는 역할 이다. C에서는 개발자가 직접 메모리 관리를 해주어야 하지만 자바에서는

GC가 있기 때문에 개발자가 메모리관리가 필요한 로직을 만들필요가 없다. 즉, 메모리 관리에

관해서 신경쓸 필요가 없다.

  • GC의 원리

 GC는 기본적으로 3가지 역할을 수행한다.

 

1. 메모리 할당

2. 사용 중인 메모리 인식

3. 사용하지 않는 메모리 인식

 

 사용하지 않는 메모리 인식을 하지 않으면 할당한 메모리 영역이 꽉 차서 WAS에 행이 걸린다.

결국 더 많은 메모리를 할당하려는 현상이 발생하게 되고 만약 WAS의 최대 메모리 크기를 지

정해서 전부 사용한 다음, GC를 해도 더 이상 사용 가능한 메모리 영역이 없는데 계속 메모리

리를 할당하려고 하면 OutOfMemoryError가 발생하여 wAS가 다운될 수도 있다.

 JVM은 일반적으로 스택, 힙, 메소드 영역으로 나눠 질 수 있다. 그 중 GC는 힙에서 실행됩니

다. 힙의 영역 중 GC가 영향을 미치는 부분은 young역역과 메모리 영역인 old이다. young은

다시 eden과 survivor로 나눠진다.

 eden에 데이터가 일정량 쌓이게 되면 eden영역의 객체는 다른 곳으로 이동하거나 삭제가 일

어난다. 이동될 때 survivor로 이동을 하게 된다. 이때 survivor는 2개의 영역중 하난는 빈공간

이어야한다. 할당된 survivor가 다 차게되면 GC가 되어 eden과 할당된 survivor에 있는 객체가

비어있는 survivor에 이동하게 됩니다. 이후 더 큰객체가 들어오거나 young 영역이 모두 차게

되면 old영역으로 이동하게 됩니다. 

  • GC의 종류

GC는 크게 두가지로 나뉜다. 마이너 GC와 메이저 GC의 두가지 GC가 발생할 수 있다.

1. 마이너 GC: young 영역에서 발생하는 GC

2. 메이저 GC: old 영역이나 Perm 영역에서 발생하는 GC

  •  4가지 GC방식

시리얼 콜렉터, 병렬 콜렉터, 병렬 컴팩팅 콜렉터, CMS 콜렉터로 나눌 수 있다.

시리얼 콜렉터는 young영역과 old영역이 연속적으로 처리되며 CPU를 사용한다. Sun에서는

이 처리를 수행할 때를 Stop - the - world라고 표현한다.

병령 콜렉터는 Throughput collector로도 알려진 방식이다. 다른 CPU가 대기 상태로 남아

있는 것을 최소화하는 것이 목적이다. 병렬로 처리하여 많은 CPU를 사용하기 때문에 GC의

부하를 줄이고 애플리케이션의 처리량을 증가시킬 수 있다.

병렬 컴팩팅 콜렉터는 JDK 5.0 업데이트 6부터 사용가능하다. young 영역에 대한 GC는 병렬

콜렉터와 동일하지만, old 영역의 GC는 다른 알고리즘을 사용한다. 병령 콜렉터와 동일하게 이

방식도 여러 CPU를 사용하는 서버에 적합하다.

CMS 콜렉터는 힙 메모리 영역의 크기가 클 때 적합하다. 2개 이상의 프로세스를 사용하는 서

버에 적당하고 대표적인 대상이 웹 서버이다.

  • 강제로 GC시키기

System.gc()메소드 나 Runtime.getRuntime().gc()메소드를 사용하면 된다. 하지만 추천하지는

않는다. 사용했을 때의 성능저하가 원인이다.

  • 정리

GC는 JVM에서 CPU와 메모리의 크기에 따라서  자동적으로 지정하게 되어 있다.

728x90