2016-02-15 33 views
0

我讀過的Java垃圾收集器是足夠聰明,處理循環引用(A-> B和B-> A,或者A-> B,B-> C和C→A)。但是,我們有涉及三個我們班的內存泄漏問題,我想知道,如果他們的相互關係有什麼用它做。 這是他們的一個簡化版本:內存泄漏涉及循環引用和數組

public class A { 
    List<B> bes; 
} 

public class B { 
    A a; 
    C c; 
} 

public class C { 
    List<B> bes; 
} 

所以,你可以看到,這樣的設計不僅創造關係(A-> B,B-> C,C-> B和B-鏈> A),而且它也涉及在兩側的中間(B類的多個實例)。

這也是我的理解,這不是標準的Java應用程序的問題,因爲所有的對象綁定到執行的主線程(公共靜態無效的主要(字符串[]參數))。然而,我們的節目住的應用服務器(IBM的Websphere)內,所以沒有主要方法。

我們確實知道存在內存泄漏,並且涉及這三個類(基於堆的內存分析結果),我想知道是否有可能組合了這些情況正在造成泄漏。

注意:值得注意的是,關係是單向的。例如,C的實例擁有對B列表的引用,但這些B不指向C,並且它們指向的As不具有返回B的引用。

+0

如果關係*絕對*是單向的,沒有循環引用。 –

回答

1

不,循環引用不會導致Java中的問題。 只要從任何GC根目錄(線程,本地變量,靜態變量,JNI引用)無法訪問,該對象對GC都有效。那就是你需要追蹤的,GC根源,看看他們是否永遠持有引用。

您可以使用一個分析器了點。