Java G1GC奇怪的行为

Java G1GC奇怪的行为,java,garbage-collection,g1gc,Java,Garbage Collection,G1gc,我决定在Eclipse Mars RC3 for JavaEE developers安装上尝试G1GC,但我发现了一个非常奇怪的行为: 正如您所看到的,它在应用程序的生命周期中运行了几乎700个完整的地面军事系统,而只有30个次要的地面军事系统。我还注意到,次要的GCs是在应用程序处于加载状态时执行的——通常是在应用程序启动并加载很多东西时,而当应用程序处于空闲状态时,它会执行完整的GCs。(这11个小时的大部分时间都是空闲的!)我希望当应用程序什么都不做时,就不需要GC,或者至少是一个小GC

我决定在Eclipse Mars RC3 for JavaEE developers安装上尝试G1GC,但我发现了一个非常奇怪的行为:

正如您所看到的,它在应用程序的生命周期中运行了几乎700个完整的地面军事系统,而只有30个次要的地面军事系统。我还注意到,次要的GCs是在应用程序处于加载状态时执行的——通常是在应用程序启动并加载很多东西时,而当应用程序处于空闲状态时,它会执行完整的GCs。(这11个小时的大部分时间都是空闲的!)我希望当应用程序什么都不做时,就不需要GC,或者至少是一个小GC。我还监控了eclipse的内存消耗——在空闲时间内,它从未增加到超过130-140 MB,所以这是这些完整的GCs看起来很奇怪的另一个原因

以下是我的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日志:

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构建


你知道G1GC为什么在显然根本不需要GC的情况下执行这些完整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()
调用通常是由JavaRMI运行时调用的。在旧的Java版本中,我认为这是每分钟都要做的,但现在增加到每小时一次。无论如何,请尝试设置这些属性以确保:

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

作为JVM选项。

所有完整的gc都是由调用
System.gc()
引起的。您的GC日志正好显示了其中的698个


因此,您的Eclipse发行版可能包含一个插件,该插件会导致大量的
System.gc()
调用。如果您无法修复这些调用,您可能会考虑使用VM选项<代码> -XX:+DababelExcGrace来抑制显式GCS。

LOL,我应该手动查看日志,而不是使用GCVIEW。有趣的是,哪个组件调用System.gc()以及为什么调用。