繁体   English   中英

G1GC奇怪的行为

[英]G1GC Strange behavior

我决定在我的Eclipse Mars RC3上尝试使用G1GC进​​行JavaEE开发人员安装,但我发现了一个非常奇怪的行为:

GCViewer统计信息

正如您所看到的,它在应用程序的生命周期中运行了近700个FULL GC,而只有30个次要GC。 此外,我注意到,当应用程序处于负载状态时会执行次要GC - 通常是在它启动并加载大量内容时,而它在空闲时执行完整的GC。 (这11个小时大部分时间都处于空闲状态!)我希望当应用程序什么都不做的时候就不需要GC了,或者说它只是一个次要的GC。 我还监视了eclipse的内存消耗 - 在空闲时间它从未增加到130-140 MB以上,所以这就是为什么这些完整的GC看起来很奇怪的另一个原因。

这是我的eclipse.ini jvm配置:

-server
-Xverify:none
-XX:+AggressiveOpts
-XX:+UseG1GC
-XX:MaxGCPauseMillis=100
-XX:+UseStringDeduplication
-XX:+UseCompressedOops
-XX:+UseCompressedClassPointers
-XX:MaxMetaspaceSize=256m
-Xloggc:/home/svetlin/software/eclipse/gc.log
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps 
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=20m
-Xms1g
-Xmx1g

这是GC日志: http//pastebin.com/sVBe4w1A

Java版本:用于linux-amd64 JRE(1.8.0_45-internal-b14)的OpenJDK 64位服务器VM(25.45-b02),于2015年5月17日19:21:01由“buildd”和gcc 4.9.2构建

当你显然根本不需要GC时,你知道为什么G1GC会使用这些完整的GC吗?

你可以在日志中看到System.gc()调用:

2015-06-14T14:56:23.682+0300: 12790,173: [Full GC (System.gc())  121M->118M(1024M), 0,4524898 secs]
   [Eden: 4096,0K(561,0M)->0,0B(561,0M) Survivors: 0,0B->0,0B Heap: 121,7M(1024,0M)->118,2M(1024,0M)], [Metaspace: 135216K->135216K(1177600K)]
 [Times: user=0,71 sys=0,00, real=0,45 secs]
2015-06-14T14:57:23.682+0300: 12850,174: [Full GC (System.gc())  121M->118M(1024M), 0,4732930 secs]
   [Eden: 3072,0K(561,0M)->0,0B(561,0M) Survivors: 0,0B->0,0B Heap: 121,2M(1024,0M)->118,2M(1024,0M)], [Metaspace: 135216K->135216K(1177600K)]
 [Times: user=0,73 sys=0,00, real=0,47 secs]
2015-06-14T14:58:28.684+0300: 12915,175: [Full GC (System.gc())  169M->118M(1024M), 0,4912699 secs]
   [Eden: 52,0M(561,0M)->0,0B(561,0M) Survivors: 0,0B->0,0B Heap: 169,9M(1024,0M)->118,8M(1024,0M)], [Metaspace: 135601K->135601K(1177600K)]
 [Times: user=0,74 sys=0,00, real=0,49 secs]

System.gc()调用似乎每分钟发生一次。 你运行任何可能导致这种情况的奇怪插件吗?

否则,定期的System.gc()调用通常是由于Java RMI运行时调用它们。 在较旧的Java版本上,我认为这是每分钟完成的,但现在每小时增加一次。 无论如何,尝试设置这些属性只是为了确保:

-Dsun.rmi.dgc.server.gcInterval=999999999
-Dsun.rmi.dgc.client.gcInterval=999999999

作为JVM选项。

所有完整的GC都是通过调用System.gc()引起的。 GC日志显示其中的698个。

因此,您的Eclipse发行版可能包含一个导致此次System.gc()调用的插件。 如果您无法修复这些调用,可以考虑使用VM选项-XX:+DisableExplicitGC来禁止显式GC。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM