IBM 的 Java 诊断,第 2 部分: 使用 Extensible Verbose Toolkit 进行垃圾收集
2010-04-01 00:00:00 来源:WEB开发网核心提示: 弱引用告诉垃圾收集器如果某个对象除了弱引用之外没有其他任何引用,则应该收集该对象,IBM 的 Java 诊断,第 2 部分: 使用 Extensible Verbose Toolkit 进行垃圾收集(10),由于映射中的每个对象都持有一个对以前的对象的引用,因此将不会清除任何弱引用并且应用程序将
弱引用告诉垃圾收集器如果某个对象除了弱引用之外没有其他任何引用,则应该收集该对象。由于映射中的每个对象都持有一个对以前的对象的引用,因此将不会清除任何弱引用并且应用程序将快速消耗完内存,如图 16 所示:
图 16. 无法使用 WeakHashMap 修复的内存泄露应用程序中的堆使用
查看原图(大图)
确保弱引用如期工作
通过在 EVTK 中绘制被清除的弱引用的图,可以证实该问题,如图 17 所示。向列表中添加链接之后,被清除的弱引用的数量将从较大的数更改为完全没有。(修改后的应用程序沿着 X 轴零点的线条非常短,而以前的应用程序的线条则又长又高。)很明显,弱引用不再起作用。
图 17. 对可能存在内存泄露的应用程序的两个变体清除弱引用
查看原图(大图)
在这种情况下,解决办法就是也将链接列表中的链接更改为弱引用。执行如清单 4 中所示的代码更改之后,弱应用的数量大大增加了,而且堆使用也返回到最小值:
更多精彩
赞助商链接