Java 玻璃鱼每小时一次

Java 玻璃鱼每小时一次,java,garbage-collection,glassfish,Java,Garbage Collection,Glassfish,我在Glassfish应用程序中看到一个完整的GC,大约每小时一次。从GC日志中提取: 9.210: [Full GC 28311K->27979K(6422528K), 0.3770238 secs] ... 3609.647: [Full GC 1186957K->597880K(6478208K), 4.5102977 secs] ... 7214.192: [Full GC 742184K->595596K(6469504K), 4.3726625 secs] ...

我在Glassfish应用程序中看到一个完整的GC,大约每小时一次。从GC日志中提取:

9.210: [Full GC 28311K->27979K(6422528K), 0.3770238 secs]
...
3609.647: [Full GC 1186957K->597880K(6478208K), 4.5102977 secs]
...
7214.192: [Full GC 742184K->595596K(6469504K), 4.3726625 secs]
...
10818.805: [Full GC 756228K->570803K(6455936K), 4.8630472 secs]
只要玻璃鱼在上面,这个模式就会重复。中间的“…”是增量地面军事系统。时间似乎非常可疑-为什么我们会看到大约每小时一次完整的GC

JVM启动参数:

-Xms6400m
-Xmx6400m
-XX:NewSize=1024m
-XX:MaxNewSize=1024m
-XX:PermSize=256m
-XX:MaxPermSize=1024m
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-Xloggc:C:\glassfish3\glassfish\domains\domain1\logs\gc\gc.log
-XX:+AggressiveOpts
-Xss1024k
-XX:+CMSClassUnloadingEnabled
根据JVisualVM的说法,堆空间即将耗尽


Glassfish 3.1.2.2,Oracle JDK 1.6.045,Windows Server 2008

我怀疑您的RMI正在触发全面清理

两者

sun.rmi.dgc.server.gcInterval

当需要确保不可访问的远程对象未被报告并及时进行垃圾收集时,此属性的值表示Java RMI运行时在本地堆垃圾收集之间允许的最大间隔(以毫秒为单位)。默认值为3600000毫秒(一小时)

sun.rmi.dgc.client.gcInterval

当需要确保及时传递对不可访问远程引用的DGC clean调用时,此属性的值表示Java RMI运行时在本地堆的垃圾收集之间允许的最大间隔(以毫秒为单位)。默认值为3600000毫秒(一小时)

默认为每小时检查


我会将这些设置为一天或一周,因为你认为你不需要它们。

你也可以尝试禁用显式GC(
-XX:+DisableExplicitGC
),看看完整的GC是否消失。

我确实尝试过将这些间隔设置为1天。有趣的是,完整GC的频率降低到了较低的间隔,但仍然多于一天。有一次是在启动后10秒左右,然后是4小时左右,然后是45分钟左右,从那以后我就再也没见过了。@Jeff剩下的完整地面军事系统可能真的需要了。您可能需要添加
-XX:+PrintGCDetails-XX:+PrintPromotionFailure
,以获取GC日志中的更多详细信息和上下文。我建议您增加代码的堆大小和内存配置文件,以减少创建的垃圾量。在极端情况下,您可能会发现应用程序一整天都没有GCG。我知道这个选项,但对使用它持谨慎态度。我的理解是JVM通常会执行增量GC,但如果增量GC不能跟上,有时需要完全GC来“赶上”。如果是这样,那么如果JVM进入那种状态,那么完全禁用完整GC似乎是有害的…@Jeff它不禁用完整GC,只禁用显式GC(
System.GC()
)。如果需要,JVM将触发完整GC,而不管该设置如何。使用Oracle JDK 6+,显式GC将以
Full GC(System)
而不是简单地
Full GC
显示在GC日志中。啊,感谢您的澄清。我从未在我们的GC日志中看到“完整GC(系统)”。我们从不从代码中调用System.gc()。