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

时间:2011-03-24 16:15:42

标签: 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:[Rescan   (平行),0.4083780秒] 29541.203:   [弱参考处理,3.2855240   secs] 29544.488:[卸货,   0.0187270秒] 29544.507:[擦洗符号&字符串表,0.0095530   secs] [1 CMS-remark:   102801236K(114294784K)]   108278518K(121844544K),3.7319690   secs] [次:用户= 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

我很感激任何回应, 谢谢, 埃雷兹。

1 个答案:

答案 0 :(得分:1)

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

可能是数据结构的变化是可能的,这会显着减少弱引用的数量。例如假设你有一个使用WeakReferences Map的缓存。如果可以使用WeakReference替换为Map,则可能会得到相同的结果,但引用次数会少得多。

您可能会看到Java 6更新24的性能提升,它有一个更新的JVM(大约一年更新)