2011-10-05 67 views
1

我正在審查一個用於查找內存泄漏的java代碼庫。在審查過程中,我發現了以下情況。java靜態成員內存泄漏

  1. 一個Class1類在代碼庫中。 Class1有一些實例變量和一些靜態成員。其他一些類創建Class1的實例。這種情況是否會導致內存泄漏?
  2. 代碼庫中可用的類Class2。它有一些公共的靜態內部類。而靜態內部類的實例是從其他靜態內部類創建的。它會導致內存泄漏嗎?例如,
Class2 { 
    public static class Class3 { 
    } 
    public static class Class4 { 
    } 
    public static class Class3 { 
     Class3 c = new Class3(); 
     //…. 
    } 
    public static int doSomething1{ 
    } 
    public static void doSomething2{ 
    } 
    public void doSomething3{ 
    } 

} 

有人可以給出答案?

回答

3

創建其他類的實例本身並不會造成內存泄漏。

堅持引用超過需要會導致內存泄漏。

那些引用可以是顯式的也可以是隱式的。例如:如果你創建了一個非靜態內部類的實例,那麼它將保持對外部實例的引用,即使沒有明確的引用存在。

所以你的直接問題的答案是確定的:也許。你需要給我們更多的信息。

並且:查找內存泄漏的一個很好的工具是使用一個分析器。特別是如果它是一個內存泄漏。

1

一般來說,靜態成員將不會被釋放,直到您將它們設置爲空。如果實例本身不可訪問,則實例變量將被釋放。 靜態內部類與普通類相似,因此遵守上述規則。

非靜態內部類由@Joachim Sauer描述。

p.s.學習使用一個分析器,它會使您的編程生涯的其餘部分受益:)

1

我有一個內存泄漏的問題。一位同事推薦了一個記憶分析工具http://www.eclipse.org/mat/

我不是java大師,甚至沒有關閉。但是我所做的就是運行我的代碼,監視程序何時會崩潰(內存不足),然後再次運行代碼,但是這次使用命令行選項-Xmx來知道會導致程序崩潰。

我也添加了-XX:+HeapDumpOnOutOfMemoryError,然後當程序崩潰時,使用了剖析工具並對堆轉儲進行剖析。

我能找到有問題的變量/對象。希望有所幫助,祝你好運!