处理 Java 程序中的内存漏洞? 研究何时应该关注内存漏洞以及如何预防内存漏洞
?
public void removeKeyFromHashtables(GraphCanvas graph) { if (graph != null) { viewFontTable.remove(graph); // 删除 hashtable 中的键 // 以预防内存漏洞 } }?
?
/** 当去掉 (dispose) FormFrame 时调用。清除引用以预防内存漏洞。 */ public void internalFrameClosed(InternalFrameEvent e) { FontManager.get().removeKeyFromHashtables(canvas); canvas = null; setDesktopIcon(null); }?
当作了这些修改以后,我使用调试器证实:当执行相同的测试案例时,与被删除的窗体相关联的对象计数减小。
?
预防内存漏洞
可以通过观察某些常见问题来预防内存漏洞。Collection 类(如 hashtable 和 vector)常常是出现内存漏洞的地方。当这个类被用 static 关键字声明并且在应用程序的整个生存期中存在时尤其是这样。
?
另一个常见的问题是,您将一个类注册为事件监听程序,而在不再需要这个类时没有撤销注册。此外,您常常需要在适当的时候将指向其他类的类成员变量设置为 null。
?
小结
查找内存漏洞的原因可能是一个乏味的过程,更不用说需要专用调试工具的情况了。但是,一旦您熟悉了这些工具以及在跟踪对象引用时进行搜索的模式,您就能够找到内存漏洞。此外,您还会摸索出一些有价值的技巧,这些技巧不仅有助于节约项目的成本,而且使您能够领悟到在以后的项目中应该避免哪些编码方式来预防内存漏洞。
?
参考资源
在开始查找内存漏洞之前,请先熟悉下列一种调试器:
?
●Sitraka Software 的 JProbe ProfilerwithMemory Debugger
●Intuitive System 的 Optimizeit JavaPerformance Profiler
●Paul Moeller 的 Win32Java Heap Inspector
●IBM alphaWorks 网站上的 Jinsight
Jinsight: A tool for visualizing theexecution of Java programs(developerWorks,1999 年 11 月)详细说明了这个实用程序是如何帮助您分析性能和调试代码的。
注:本文讨论的项目是用 JDK 1.1.8 完成的,但 JDK 1.2 引入了一个新包,java.lang.ref,这个包可与垃圾收集器交互。另外,JDK 1.2 还引入了一个 java.util.WeakHashMap 类,可用它来代替传统的java.util.Hashtable 类。这个类不会阻止垃圾收集器回收键对象。JDK 1.3 的 Solaris、Linux 和Microsoft Windows 版本引入了 Java HotSpot Client VM,该虚拟机带有一个新的、经过改进的垃圾收集器。
作者简介
Jim Patrick 是 IBMPervasive Computing Division 的一名顾问程序员。他从 1996 年开始用 Java 编写程序。请通过 patrickj@us.ibm.com 与 Jim 联系。
?