我做了什么使得"弱参考处理"需要30秒而不是1.5秒?

Ere*_*avy 11 java garbage-collection weak-references

故事

我的服务器运行24x2处理器,java堆大约70 GB.在安装新版本(版本-B)之后的某个时刻,我看到Full GC需要大约30秒(停止所有线程).启用XX:+ ParallelRefProcEnabled后,弱ref处理下降到3-6秒左右.但这只是一种"弯曲辅助",而不是治愈方法.

2011-03-22T20:38:24.276 + 0000:29540.794:[GC [YG占用:5477281 K(7549760 K)] 29540.794:重新扫描(平行),0.4083780秒] 29541.203:[弱参处理,3.2855240秒] 29544.488: [类卸载,0.0187270秒] 29544.507:[擦洗符号串的表,0.0095530秒] [1 CMS-备注:102801236K(114294784K)] 108278518K(121844544K),3.7319690秒] [时间:用户= 65.53 SYS = 0.14,真= 3.73秒]

在版本B之前(并且没有ParallelRefProcEnabled标志),弱ref处理过去需要大约1.5秒.(对于大致相同的负载)

目的:

我试图找出的是,引入版本-B的变化导致处理从1.5秒跳到30秒.版本B中有一些变化,没有涉及弱引用的真正怀疑.

我想改变我的代码,以便它不会在重度弱的ref处理上进行转发.

问题:

  • 我想了解"弱参考处理"阶段究竟发生了什么,所以我可以找一个嫌疑人,或者证明代码重写是正确的.有关阅读该阶段究竟发生了什么的任何好资源?

  • 长期"弱参考处理"的可能原因是什么?(弱引用实例的数量,持有弱引用的对象的数量,弱引用的引用树的深度,......)

更多信息:

  • CPU使用率不是很高,似乎不是问题
  • GC(包括弱参考处理)大约每8分钟发生一次.
  • 运行Java Sun,1.6.0_20

我很感激任何回复,谢谢,Erez.

Pet*_*rey 1

AFAIK,参考处理时间是确定是否可以收集参考所需的时间。这应该与您拥有的 WeakReference 的数量成正比。

数据结构的改变可能会显着减少弱引用的数量。例如,假设您有一个使用弱引用映射的缓存。如果可以将其替换为对映射的弱引用,您可能会得到相同的结果,但引用会少得多。

您可能会发现 Java 6 update 24 的性能有所提高,它具有更新的 JVM(大约更新了一年)