首页 文章

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

提问于
浏览
11

故事

我的服务器运行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(parallel),0.4083780 secs] 29541.203:[weak refs processing,3.2855240 secs] 29544.488: [类卸载,0.0187270秒] 29544.507:[擦洗符号和字符串表,0.0095530秒] [1 CMS-备注:102801236K(114294784K)] 108278518K(121844544K),3.7319690秒] [时间:用户= 65.53 sys = 0.14,real = 3.73秒]

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

目的:

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

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

问题:

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

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

更多信息:

  • CPU使用率不是很高,似乎不是问题

  • GC(包括弱参考处理)大约每8分钟发生一次 .

  • 运行Java Sun,1.6.0_20

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

1 回答

  • 1

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

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

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

相关问题