2013-07-26 65 views
2

如果我在類中定義一個變量static如下:定義靜態列表可能會導致內存泄漏?

class MyClass 
{ 
    private static List<String> list = new ArrayList<String>(); 
} 

list導致內存泄漏?如果是,那麼如何?

+2

一個問題給你。爲什麼它是靜態的? –

+0

@AndrewThompson我剛剛來到以下答案http://stackoverflow.com/a/6548647。第一點是說它可能導致memroy泄漏,但我無法得到它。所以我在這裏問。 – Mac

+1

@Mac如果列表不斷增加,您將保留對您可能不需要的對象的引用,並且它們不會被垃圾收集。這是一個內存泄漏。您仍然可以通過清除列表來修復它。 –

回答

2

您發佈的代碼片段是內存泄漏,因爲如果您從未清除該列表中的元素或將其設置爲null,它將保持增長並且不會收集垃圾。

對於非靜態列表(實例或局部範圍列表),這種情況發生得少得多。使用非靜態變量時,一旦實例超出範圍,變量(也可能是對象)也會變化,因此可以收集垃圾。使用靜態變量,他們永遠不會超出範圍(除非您將參考設置爲null,您無法在final上執行此操作),因爲它們已鏈接到該類。

+1

感謝您的澄清:) – Mac

-1

靜態變量分類放在一個特殊的內存空間意義,在你的應用程序exsists只有1個數組Myclass.list,而事情是他們不是動態的。所以你的名單必須有一個固定的大小。

public final static String[] list=new String[] 
    {"str1", //0 
    "str2", //1 
    "str3", //2 
    "str4", //3 
    }; 

您不能修改這些值,結果我懷疑它會導致泄漏。

1

從技術上講,只有當它不在garbage collector's範圍內時纔會發生內存泄漏。另一方面,如果它在內存中的時間很長,即使你沒有使用它,那麼這也是一個logical flaw,它也會使相關的對象不再被佔用。內存將僅在班級卸載時回收。

1

它不一定是可能導致內存泄漏的靜態列表(集合)。如果我們有一個長壽命的集合(例如緩存),我們應該以某種方式限制它的大小,例如通過刪除舊對象形式。