我在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]
只要Glassfish上升,这种模式就会大致重复。其间的“......”是增量GC。时间似乎非常可疑 - 为什么我们会在一小时左右看到完整的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.0_45,Windows Server 2008
答案 0 :(得分:6)
我怀疑你的RMI正在触发全面清理。
http://docs.oracle.com/javase/6/docs/technotes/guides/rmi/sunrmiproperties.html
两个
sun.rmi.dgc.server.gcInterval
当需要确保未导出的远程对象未被导出并及时收集垃圾时,此属性的值表示Java RMI运行时将允许在本地堆的垃圾收集之间的最大间隔(以毫秒为单位) 。默认值为3600000毫秒(一小时)。
和
sun.rmi.dgc.client.gcInterval
当需要确保及时传递DGC clean调用无法访问的远程引用时,此属性的值表示Java RMI运行时将允许在本地垃圾集合之间的最大间隔(以毫秒为单位)堆。默认值为3600000毫秒(一小时)。
默认为每小时检查。
我会将这些设置为一天或一周,因为您认为您不需要这些。
答案 1 :(得分:1)
您还可以尝试禁用显式GC(-XX:+DisableExplicitGC
)并查看FullGC是否消失。