이 글은 Java Performance Tuning white paper (by Michael Finocchiaro) 를 보고 발췌 요약 정리한 것입니다.
필요한 부분만 발췌 요약했으며 적당하다고 생각되는 선에서 정리했음을 이해하고 보아 주시기 바랍니다.

The Java Heap

Hotspot Heap 은 크게 Young Gen., Old Gen., Permanent Gen. 으로 구분된다.

Young Generation (YoungGen)

Young Generation 은 크게 Eden Space, S0(From) Space, S1(To) Space 로 나눌 수 있다

1. Eden Space

– 새롭게 생성된 객체들이 위치
– Eden Space 가 꽉 차게 되면, Scavenge GC 가 동작하여 참조되지 않은 객체들을 제거

2. Survivor Space => S0 (From) / S1 (To) Space

– intermediate-life 객체가 보관되는 공간
– From Space 와 To Space 는 동일한 크기
– Eden Space 에 존재하다가 Scavenge GC 에 살아남은 객체들은 From Space 로 이동
– Scavenge GC 가 끝나면, From Space 와 To Space 가 맞교환된다 (Space 를 지칭하는 Pointer를 바꿈)

Young Generation 은 -Xmn 옵션을 통해 크기를 지정할 수 있다
아래는 일반적인 설정 기준이다

– size(YoungGen) <= size(JVM heap)
– size(YoungGen) = size(JVM heap) / 2, if size(JVM heap) < 1.5Gb
– size(YoungGen) = size(JVM heap) / 3, if size(JVM heap) > 1.5Gb

Survivor Space 의 크기는 Eden Space 크기의 일정 비율로 결정된다

– XX:SurvivorRatio 로 비율 지정
– size(YoungGen) — 2 * size(S0) : size(S0) = SurvivorRatio : 1
– ex. -Xmn400m & -XX:survivorRatio=4 — 400m — 2*size(S0) = 4 : 1 — size(s0) = 66.6m — size(Eden) = 400m — 2 * size(S0) = 400m — 2 * 66m = 266m

Old Generation (OldGen)

객체가 일정 횟수 이상 Scavenge GC 에 살아남으면, To Space 에서 Old Generation 으로 승격된다
-일정 횟수는 -XX:MaxTenuringThreshold 로 설정 가능
Old Generation 객체들은 Full GC 와 Concurrent Mark-and-Sweep (CMS) GC 외에는 정리되지 않는다
Old Generation 공간이 가득 차면, 공간 확장을 시도하는데 이 과정에서 Full GC 가 발생한다
공간 확장 시 더 이상 늘릴 수 없으면(최대치) Out Of Memory Error (OOME) 가 발생한다

Old Generation 의 크기는 -Xms (초기 크기) 와 -Xmx (최대 크기) 로 설정 가능하다
(단, -Xmn 을 빼야 한다 => -Xms / -Xmx 가 Young Gen + Old Gen 크기를 지칭함)
지정한 heap size 가 시스템의 가용 메모리(빈 공간) 보다 크면 swapping 이 발생하며, 성능이 급격히 저하된다

Permanent Generation (PermGen)

Permanent Generation 에는 compile 된 class 와 JSP page 등이 보관된다
Permanent Generation 도 공간이 가득 차서 공간 확장을 시도하면 Full GC 가 발생한다
마찬가지로 공간 확장 시 더 이상 늘릴 수 없으면(최대치) Out Of Memory Error (OOME) 가 발생한다

Permanent Generation 의 크기는 -XX:PermSize (초기 크기) 와 -XX:MaxPermSize (최대 크기) 로 설정 가능하다
PermGen 의 공간으로 128M 이상의 메모리가 필요한 경우는 극히 드물다

Total heap size calculation

그림에 포함되지는 않았지만, JVM 에서는 내부 JVM 메모리 관리를 위해 Code Cache 라는 이름으로 50Mb 정도의 공간을 추가로 사용한다

즉, 전체 heap 크기는 아래와 같이 계산하여야 한다

– 초기 크기 = -Xms + -XX:PermSize + ~50Mb
– 최대 크기 = -Xmx + -XX:+MaxPermSize + ~ 50Mb

ps.

White paper 는 Technet 의 문서를 참조하였는데요. 참조한 문서는 여기에 있습니다.
http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

또한, Garbage Collector tutorial 문서도 참고하기 좋은 것 같습니다.
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

--

--