Technical Note/JAVA
GC 튜닝

1 Old 영역의 크기 결정
old는 상시적으로 유지되는 객체의 크리를 추정해서 해당 대비 4배 정도로 잡습니다.
Tenured 영역의 50% 를 넘어설 때, 첫 Tenured GC가 발생합니다. 튜닝이 제대로 되면 40%에서 유지시킬 수 있습니다.

2. New에서 old로 넘어가기 위한 threashold 를 증가 
new 영역(Young 영역)은 eden과 survivor 영역(s0, s1 영역으로 다시 구분)으로 구성되는데, 최초 객체 생성시 eden에 생성됩니다.
eden 영역이 꽉차면 minor gc가 발생하고 살아남은 객체들은 survivor 영역(s0)으로 이동합니다.
다시 eden 영역이 꽉차면 minor gc가 발생하고 eden  영역에서 살아남은 객체와 s0에서 살아남은 객체가 s1 영역으로 이동합니다.
다시 eden 영역이 꽉차면 minor gc가 발생하고 eden 영역에서 살아 남은 객체와 s1에서 살아남은 객체가 s0으로 이동합니다. 

즉, 영원히 살아남는 객체는
eden -> s0 -> s1 --> s0 --> s1 --------> old  순으로 이동합니다.

survivor 영역에서 old로 언제 이동시키는가? 
이결정에 대해 default gc는 두가지 파라미터를 제공합니다 

s0, s1의 이동횟수  threshold값 (기본 31) 과 s0 영역의 사용량의 Threshold 값입니다 
이 파라미터를 사용해서 eden 영역과 s0 영역의 크기는 다음과 같이 예측 가능하다

이동횟수를 1로 잡고 eden 영역과 s0 영역을 동일하게 잡는다

old 영역은 충분히 커야 합니다

이후 부하를 가해 변화량을 측정합니다

eden 에서 살아남은 s0 의 메모리크기는 Mimor gc 시 객체의 생존율입니다
이동횟수가 1이기때문에 minor gc 발생후, s0 영역에서 old로 바로 집입하기 때문에 old 영역의 증가율이 s0에서 생존율입니다 


http://lsleez.tistory.com/entry/GC-%ED%8A%9C%EB%8B%9D%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%98%EA%B2%AC%EB%93%A4



System.gc()를 disable 시키는 방법 
-XX:+DisableExplicitGC 셋팅

추가사항
1) PermSize와  MaxPermSize는 동일하게 설정하는게 좋음
2) 튜닝을 아무리 잘해도 Tenured GC는 발생함
이유는 아무리 eden 영역이 커도 old 영역으로 promotion되는 객체는 존재할 수 밖에 없기 때문이다.
그리고 promition 되는 객체들이 아주 미량이나마 존재하는한 언젠가는 Tenured GC가 발생한다.
그렇기 때문에 JVM 전체 메모리를 아주 크게 설정하는게 가장 좋은 답은 아니다.


튜닝의 순서 application --> 공통 유틸 --> 미들웨어 --> jvm --> os 순으로

궁금증
RMI에서 하는 GC란??


GC Viewer Tool
자바의 경우 가비지 컬렉션은 매우 중요한 메키니즘 입니다.
특히나, 자바로 서버를 개발할 경우에는 필히 알고 있어야 되겠죠..
이러한 가비지 컬렉션을 통해서 메모리의 상태를 비주얼 하게 보게 된다면, 서버 모니터링시에 매우 도움이 될 것입니다. 아래는 가비지 컬렉션을 보여주고 있는 툴들입니다.

http://java.sun.com/performance/jvmstat/
http://docs.hp.com/en/5991-6757/ch03s04.html
http://java.sun.com/developer/technicalArticles/Programming/GCPortal/
http://shark.ucsf.edu/gc/viewer/index.html
http://www.javaperformancetuning.com/tools/gcviewer/index.shtml


1. 다운 사이트

2. 특징

  • garbage collection데이터를 통해 성능 지표(throughput, accumulated pauses, longest pause 등)를 계산하여 보기 좋게 보여줌
  • GC Viewer같은 경우는 csv 포멧으로 데이터를 import할 수 있음
  • generation sizes를 변경하고 heap size를 설정하는 등을 통해 gc를 튜닝하는데 유용함

3. 플랫폼 별 설정 방법

  • Sun JDK 1.4/1.5 : -Xloggc:<file> [-XX:+PrintGCDetails]
  • Sun JDK 1.2.2/1.3.1/1.4 : -verbose:gc
  • IBM JDK 1.3.1/1.3.0/1.2.2 :n -verbose:gc
  • HP-UX JDK 1.2/1.3/1.4.x : -Xverbosegc
  • BEA JRockit 1.4.2/1.5 : -verbose:memory
  • 표준 : -Xloggc:<file> -XX:+PrintGCDetails

4. GC관련 아티클

Tags : , ,