2012-10-06 2 views
-2

young gen, tenured gen 및 perm gen에 여유 공간이 있어도 full gc가 4000 초마다 발생하는 이유는 무엇입니까?힙의 여유 공간이 있더라도 전체 GC가 발생합니다.

GC 매개 변수 :

-XX:CMSInitiatingOccupancyFraction=50 
-XX:+UseCMSInitiatingOccupancyOnly 
-XX:+UseConcMarkSweepGC 
-XX:+UseParNewGC 
-Xloggc:GC.log 
-XX:+PrintGCDetails 
-XX:+PrintTenuringDistribution 
-XX:MaxTenuringThreshold=8 
-XX:PermSize=128M 
-XX:MaxPermSize=128M 
-XX:+CMSPermGenSweepingEnabled 

JVM 인수 :

-Xms25G -Xmx25G

GC의 로그는 다음과 같습니다

22463.534: [GC 22463.534: [ParNew 
Desired survivor size 8716288 bytes, new threshold 3 (max 8) 
- age 1: 3725848 bytes, 3725848 total 
- age 2: 3199384 bytes, 6925232 total 
- age 3: 2962800 bytes, 9888032 total 
: 150702K->15367K(153344K), 0.0343470 secs] 5647083K->5515157K(26197376K), 0.0344540 secs] [Times: user=0.21 sys=0.00, real=0.04 secs] 
22476.236: [GC 22476.236: [ParNew 
Desired survivor size 8716288 bytes, new threshold 3 (max 8) 
- age 1: 4130920 bytes, 4130920 total 
- age 2: 3110336 bytes, 7241256 total 
- age 3: 3125208 bytes, 10366464 total 
: 151687K->16210K(153344K), 0.0357830 secs] 5651477K->5519299K(26197376K), 0.0358820 secs] [Times: user=0.22 sys=0.00, real=0.04 secs] 

**22478.730: [Full GC (System) 22478.730: [CMS: 5503089K->4624468K(26044032K), 33.8259070 secs] 5560326K->4624468K(26197376K), [CMS Perm : 12045K->11957K(131072K)], 33.8260340 secs] [Times: user=33.38 sys=0.06, real=33.83 secs]** 

22513.164: [GC 22513.164: [ParNew 
Desired survivor size 8716288 bytes, new threshold 8 (max 8) 
- age 1: 4477888 bytes, 4477888 total 
: 136320K->9674K(153344K), 0.0734160 secs] 4760788K->4634143K(26197376K), 0.0735590 secs] [Times: user=0.55 sys=0.00, real=0.08 secs] 
22522.765: [GC 22522.766: [ParNew 
Desired survivor size 8716288 bytes, new threshold 8 (max 8) 
- age 1: 3725528 bytes, 3725528 total 
- age 2: 4220800 bytes, 7946328 total 
: 145994K->8939K(153344K), 0.0226740 secs] 4770463K->4633407K(26197376K), 0.0228130 secs] [Times: user=0.15 sys=0.00, real=0.03 secs] 

답변

1

한 가지 가능한 설명은 뭔가 System.gc()를 호출이다 주기적으로 그것은 당신의 코드 일 수도 있고, 당신이 사용하고있는 라이브러리 코드 일 수도 있습니다; 예 : System.gc() calls by core APIs.

java 옵션을 설정하여이 이론을 테스트 할 수 있습니다.이 옵션은 System.gc() 호출을 무시하도록 JVM에 지시하고 전체 GC가 중지되는지 확인합니다. (내가 언급 한 옵션은 -XX:+DisableExplicitGC ... 감사합니다. Frank).

+0

@Abhishek 힌트는 "Full GC"다음의 (시스템) 부분입니다. -XX : + DisableExplicitGC 또는 -XX : ExplicitGCInvokesConcurrent 및 -XX : ExplicitGCInvokesConcurrentAndUnloadsClasses 중 하나를 시도 할 수 있습니다. –

+0

이렇게하면 문제가 해결됩니다. 나는 RMI가 명백한 system.gc()를 일으키고 있다고 생각한다. 도와 주셔서 감사합니다. – Abhishek

관련 문제