JAVA内存泄漏,走开!

2005-09-13 10:20  出处:  作者:Staffan Larsen;glorywine  责任编辑:moningfeng 


寻找根本原因
  知道那些对象的类会导致泄露,有时候足够制止泄露问题。这个类也许只是被用在非常有限的部分,通过快速的视察就可以找到问题所在。不幸的是,这些信息是不够的。比方说,经常导致内存泄漏的对象类java.lang.String,然而String类被应用于整个程序,这就变得有些无助。

  我们想知道的是其他的对象是否会导致内存泄漏,好比上面提到的String类,为什么这些导致泄漏的对象还是在周围存在?哪些引用是指向这些对象的?如果列出所有引用String的对象,工作就会变得太大而没有实际意义。为了限制数据的数量,我们可以通过类把他们编成一个组,这样我们就可以看到,那些其他类的对象会依然泄漏对象(String类)。比如,将一个String类放入Hashtable,那里我们可以看到关联到String类的Hashtable入口。从Hashtable入口向后运行,我们终于找到那些关联到String类的Hashtable对象(参看图三如下)。

Figure 3. Sample view of the type graph as seen in the tool

向后工作
  自从开始我们就一直着眼于对象类,而不是单独的对象,我们不知道那个Hashtable存在泄漏。如果我们可以找出所有的Hashtable在系统中有多大,我们可以假设最大的那个Hashtable存在泄漏(因为它可以聚集足够的泄漏而变得很大)。因此,所有Hashtable,同时有和所有他们所涉及的数据,可以帮助我们查明导致泄露的精确的Hashtable。

Figure 4. Screenshot of the list of Hashtable objects and the size of the data they are holding live

  计算一个对象所涉及的数据的开销是非常大的(这要求引用图表伴随着那个对象作为根运行)而且如果对每一个对象都这样处理,就需要很多时间。知道一些关于Hashtable内部的实现机制可以带来捷径。在内部,一个Hashtable有一个Hashtable的数组入口。数组的增长伴随着Hashtable中对象的增长。因此,要找到最大的Hashtable,我们可以把搜索限制在寻找包含Hashtable引用入口的最大的数组。这样就更快捷了。

Figure 5. Screenshot of the listing of the largest Hashtable entry arrays, as well as their sizes.

键盘也能翻页,试试“← →”键
相关文章

相关软件:

腾讯QQ2012
大小:52.93 MB 授权:免费
腾讯QQ2012
立即下载
腾讯QQ2013
大小:49.32 MB 授权:免费
腾讯QQ2013
立即下载
Loading...