如果我在類中定義一個變量static
如下:定義靜態列表可能會導致內存泄漏?
class MyClass
{
private static List<String> list = new ArrayList<String>();
}
能list
導致內存泄漏?如果是,那麼如何?
如果我在類中定義一個變量static
如下:定義靜態列表可能會導致內存泄漏?
class MyClass
{
private static List<String> list = new ArrayList<String>();
}
能list
導致內存泄漏?如果是,那麼如何?
您發佈的代碼片段是內存泄漏,因爲如果您從未清除該列表中的元素或將其設置爲null
,它將保持增長並且不會收集垃圾。
對於非靜態列表(實例或局部範圍列表),這種情況發生得少得多。使用非靜態變量時,一旦實例超出範圍,變量(也可能是對象)也會變化,因此可以收集垃圾。使用靜態變量,他們永遠不會超出範圍(除非您將參考設置爲null
,您無法在final
上執行此操作),因爲它們已鏈接到該類。
感謝您的澄清:) – Mac
靜態變量分類放在一個特殊的內存空間意義,在你的應用程序exsists只有1個數組Myclass.list
,而事情是他們不是動態的。所以你的名單必須有一個固定的大小。
public final static String[] list=new String[]
{"str1", //0
"str2", //1
"str3", //2
"str4", //3
};
您不能修改這些值,結果我懷疑它會導致泄漏。
從技術上講,只有當它不在garbage collector's
範圍內時纔會發生內存泄漏。另一方面,如果它在內存中的時間很長,即使你沒有使用它,那麼這也是一個logical flaw
,它也會使相關的對象不再被佔用。內存將僅在班級卸載時回收。
它不一定是可能導致內存泄漏的靜態列表(集合)。如果我們有一個長壽命的集合(例如緩存),我們應該以某種方式限制它的大小,例如通過刪除舊對象形式。
一個問題給你。爲什麼它是靜態的? –
@AndrewThompson我剛剛來到以下答案http://stackoverflow.com/a/6548647。第一點是說它可能導致memroy泄漏,但我無法得到它。所以我在這裏問。 – Mac
@Mac如果列表不斷增加,您將保留對您可能不需要的對象的引用,並且它們不會被垃圾收集。這是一個內存泄漏。您仍然可以通過清除列表來修復它。 –