IBM 的 Java 诊断,第 2 部分: 使用 Extensible Verbose Toolkit 进行垃圾收集
2010-04-01 00:00:00 来源:WEB开发网核心提示: 图 14 显示该应用程序的堆使用情况,堆使用中的骤降标记了对堆进行压缩的点,IBM 的 Java 诊断,第 2 部分: 使用 Extensible Verbose Toolkit 进行垃圾收集(9),当 JVM 内存不足时,日志结束,弱引用可能不足以更正某些泄露,如果图 15 中的映射是链接的列
图 14 显示该应用程序的堆使用情况。堆使用中的骤降标记了对堆进行压缩的点。当 JVM 内存不足时,日志结束。
图 14. 泄露严重的应用程序的堆使用情况
查看原图(大图)
使用弱引用来避免泄露
切换到 WeakHashMap,如清单 2 所示,立即更正该问题;新的改进的堆使用情况如图 15 所示。堆使用从不会超过 1MB,并且应用程序可以继续保持不确定地运行。
清单 2. 对防止内存泄露的 Leaker 类的简单更正
private Map things = new WeakHashMap();
图 15. 使用 WeakHashMap 修复可能存在泄露的应用程序
查看原图(大图)
但是,弱引用可能不足以更正某些泄露。如果图 15 中的映射是链接的列表,如清单 3 所示,那会发生什么情况呢?
清单 3. 对再次引用泄露的 Leaker 类的进一步修改
public class Leaker
{
private Map things = new WeakHashMap();
public void leak() {
Object previousThing = null;
while (true) {
final Leak thing = new Leak(previousThing);
things.put(new Date(), thing);
previousThing = thing;
}
}
private class Leak
{
private Object data;
public Leak(Object thing) {
/* Make a linked list */
data = thing;
}
}
}
更多精彩
赞助商链接