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

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. 泄露严重的应用程序的堆使用情况
IBM 的 Java 诊断,第 2 部分: 使用 Extensible Verbose Toolkit 进行垃圾收集

查看原图(大图)

使用弱引用来避免泄露

切换到 WeakHashMap,如清单 2 所示,立即更正该问题;新的改进的堆使用情况如图 15 所示。堆使用从不会超过 1MB,并且应用程序可以继续保持不确定地运行。

清单 2. 对防止内存泄露的 Leaker 类的简单更正

 private Map things = new WeakHashMap(); 

图 15. 使用 WeakHashMap 修复可能存在泄露的应用程序
IBM 的 Java 诊断,第 2 部分: 使用 Extensible Verbose Toolkit 进行垃圾收集

查看原图(大图)

但是,弱引用可能不足以更正某些泄露。如果图 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; 
 } 
 } 
} 

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

Tags:IBM Java 诊断

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