WEB开发网
开发学院软件开发Java IBM 的 Java 诊断,第 2 部分: 使用 Extensible V... 阅读

IBM 的 Java 诊断,第 2 部分: 使用 Extensible Verbose Toolkit 进行垃圾收集

 2010-04-01 00:00:00 来源:WEB开发网   
核心提示: 软引用和弱引用软引用 是在堆中可用空间不足的情况下可以清除的引用,它们对于内存敏感的高速缓存非常有用,IBM 的 Java 诊断,第 2 部分: 使用 Extensible Verbose Toolkit 进行垃圾收集(8),弱引用 是在所引用对象没有其他引用时将被清除的引用,它们对于将元数据与

软引用和弱引用
软引用 是在堆中可用空间不足的情况下可以清除的引用。它们对于内存敏感的高速缓存非常有用。弱引用 是在所引用对象没有其他引用时将被清除的引用。它们对于将元数据与对象关联的映射以及维护侦听器列表非常重要。当然,如果想永久保留映射中的所有内容,它们不太理想。

通常,诊断内存泄露非常简单。在应用程序上启用详细 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(); 
 } 
 } 
} 

上一页  3 4 5 6 7 8 9 10  下一页

Tags:IBM Java 诊断

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接