IBM 的 Java 诊断,第 2 部分: 使用 Extensible Verbose Toolkit 进行垃圾收集
2010-04-01 00:00:00 来源:WEB开发网软引用和弱引用
软引用 是在堆中可用空间不足的情况下可以清除的引用。它们对于内存敏感的高速缓存非常有用。弱引用 是在所引用对象没有其他引用时将被清除的引用。它们对于将元数据与对象关联的映射以及维护侦听器列表非常重要。当然,如果想永久保留映射中的所有内容,它们不太理想。
通常,诊断内存泄露非常简单。在应用程序上启用详细 GC,将它运行一段时间,然后在 EVTK 中绘制使用的堆(收集之后)。当应用程序正在初始化或者应用程序的工作负载增加时,应用程序的内存使用自然也将增加。如果没有任何明显的原因应用程序要增加内存要求时,使用的堆的线条向上蔓延,则有可能存在泄露。EVTK 查找该模式并添加调整建议的注释(如果检测到可能存在泄露)。
虽然详细 GC 可能显示存在泄露,但它没有告诉您是哪个对象引起的这个泄露。在某些情况下,通过检测代码才能够发现。考虑哈希映射和其他集合。它们所有都是静态的吗?它们是否都有删除对象以及添加对象的机制?应用程序对其缓存对象是否过于慷慨?对象轮询也可能是内存泄露的原因。
如以下示例所示,弱引用和软引用都是解决内存泄露的强大工具。考虑确定有泄露的应用程序,如清单 1 所示。它添加到映射,但从不清除它。
清单 1. 内存严重泄露的 Java 类
public class Leaker
{
private Map things = new HashMap();
public void leak() {
while (true) {
things.put(new Date(), new Leak());
}
}
private class Leak
{
private Object data;
public Leak() {
data = new Object();
}
}
}
更多精彩
赞助商链接