2

在我们的 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

4

2 回答 2

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 清理调用时,此属性的值表示 Java RMI 运行时允许本地堆的垃圾收集之间的最大间隔(以毫秒为单位)。默认值为 3600000 毫秒(一小时)。

默认为每小时检查。

我会将这些设置为一天或一周,因为您相信您不需要这些。

于 2013-06-10T16:43:32.240 回答
1

您还可以尝试禁用显式 GC ( -XX:+DisableExplicitGC) 并查看 FullGC 是否消失。

于 2013-06-10T17:32:48.500 回答