태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

Sun Java Forum - 잘못된 Young Generation 크기에 의한 Full GC 발생

Enterprise Java 2007.09.22 22:24
아래 논의 내용은 잘못된 New Generation 크기에 의한 Full GC 발생에 관한 것이다.

"-Xmn64m -Xmx64m"의 옵션을 사용했는데 왜 Full GC만 발생하느냐는 것이 질문의 요지이다.
-Xmn은 New Generation의 크기를, -Xmx은 Heap(New+Tenured) Size의 최대 크기를 지정하는 것이므로 New Generation의 크기를 Heap 크기와 동일하게 준 것이다.

아래에 첨부된 GC log를 보면 알 수 있듯이 이 경우 JVM은 Tenured Space를 0이 아닌 2M 정도로 지정하고 있다. 이것이 Max Heap Size가 64M인 경우 Tenured Space의 최소 크기인 것을 알 수 있다.

이 경우 Full GC만 계속해서 발생하는 이유는 Promotion Failure 때문이다. Young Generation을 정리하는 Minor GC과정에서 Live Object들을 Tenured Space로 승격(Promotion) 시키는 현상이 발생하는데 만일 Tenured Space에 충분한 여유 공간이 없으면 JVM은 Full GC를 수행해서 모든 Garbage들을 다 제거하기 위해 노력한다. 즉 Promotion Failure가 발생한 경우에는 반드시 Full GC가 수반된다.

이런 이유 때문에 New Generation의 크기를 지나치게 크게 설정하는 것은 매우 위험하다. New Generation의 크기를 얼마 정도로 해야 하는지는 정답이 없지만 절대 전체 Heap Size의 절반을 넘어서는 안된다.

내가 생각하는 가장 좋은 방법은 시스템 기본값으로 그대로 둔 상태에서 Full GC의 발생 정도를 보고 증감을 시키는 것이다. Full GC가 빈번하게 발생하는 경우에는 값을 감소시키고, 반대의 경우에는 값을 증가시키면서 최적의 값을 찾는다.

Sun HotSpot JVM은 New Generation의 크기를 동적으로 변경하는 기능을 가지고 있다. -XX:+UseAdaptiveSizePolicy 옵션에 의해 제어되며 기본값은 True이다. 하지만 간혹 버그나 오동작에 의해 이 동적인 New Generation 크기 변경이 문제를 일으키는 경우가 있다. 만일 메모리의 여유가 충분한데도 Full GC가 발생한다면 이러한 현상을 의심해보아야 하며 -XX:-UseAdaptiveSizePolicy 옵션을 이용해서 동적인 크기 조정을 비활성화시켜볼 필요가 있다.



0 Duke Stars available
This topic has 1 reply on 1 page.
whartung
Posts:131
Registered: 2/15/00
All my JVM does is full GC's
Sep 21, 2007 4:20 PM

I have a simple application, it doesn't use much memory.

In the beginning, as the heap expands, I get my incremental GCs.

But eventually, I get Full GCs, and after that all I get is full GCs. No matter how much memory I give my app.

My app doesn't require a lot of memory. After GC it rarely goes above 8M.

I've run it with everything from -Xmx16m up to -Xmx64m.

When I PrintGCDetails, or look at it through jconsole, the tenured generation is always full.

$ java -version
java version "1.5.0_11"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)
Java HotSpot(TM) Client VM (build 1.5.0_11-b03, mixed mode)

java -Xmn16m -Xmx16m -verbose:gc -XX:+PrintGCDetails

[Full GC [Tenured: 2047K->2047K(2048K), 0.1542593 secs]16831K->5629K(16832K), [Perm : 24339K->24339K(24576K)], 0.1543772secs]

If I run with 64M, it just takes longer before the Full GC, but I neverget the incrementals again, and the Tenured space is still 2MB.

java -Xmn16m -Xmx16m -verbose:gc -XX:+PrintGCDetails

[Full GC [Tenured: 2047K->2047K(2048K), 0.2037613 secs] 61055K->7943K(61056K), [Perm : 27706K->27
706K(27904K)], 0.2038618 secs]

I'm assuming I'm getting the Full GCs because the Tenured generation isfull. But I can't seem to find a way to change the size. I triedNewRatio, but it didn't seem to have any affect at all.

This isn't really a performance issue, but it is a pedantic issue as Idon't think I should be doing Full GCs all of the time, that just seemslike an "unhealthy" or at least "out of balance" JVM/Applicationconfiguration, so I'd like to get the GC working better in a healthierway with more incremental GCs rather than always doing Full GCs.

Any hints would be appreciated.

Dion_Cho
Posts:25
Registered: 9/6/07
Re: All my JVM does is full GC's
Sep 22, 2007 3:11 AM (reply 1 of 1)

Why Xmn == Xmx? (Maybe just for experimental test....)

As gc log says, your tenrued size is always only < 2M size. Why?because you set new generatio size == max heap size. JVM set thetenured size to its minimum.

Tenured size is so small that your young objects located in new spacecannot be promoted to tenured space. So JVM decides to start full gc -to clear all the garbages.

For this reason, it is unresonable and meaningless to set younggeneration size > tenured generation size. It might cause full gccontinuously.
Additionaly, keep in mind that too big young generation sometimes has tendency to make problems related to full gc.



신고
Trackback 0 : Comment 0

Write a comment

티스토리 툴바