2016-02-05 202 views
3

讓我說我有一個Java代碼,它不斷運行,每分鐘應該得到一個真正沉重的對象數組,並繼續他們。下面的代碼做這項工作:Java中潛在的內存泄漏,這段代碼是否會導致內存泄漏?

while (true) { 

    ArrayList<HeavyObject> objArr = this.getHeavyObject(); 
    drv.processObject(objArr); 

    try { 
     Thread.sleep(60000); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

我的問題是:
可能這個代碼導致內存泄漏執行ArrayList<HeavyObject> objArr = this.getHeavyObject();時沒有得到新一批重物前分配objArr = null

按照«Memory leaks in Java»文章,如果我不離開變量的範圍是使用分配給null重要(此代碼是main()的一部分,是活的,直到我退出程序)。

你能澄清這方面適用於上面列出的代碼?

回答

1

只要drv對象不保留對objArr的引用,代碼中就不會有泄漏。對於「重對象」的參考objArr僅限於while循環的範圍,因此一旦您離開迭代,就有資格進行垃圾回收。 但是,如果drv保持對該對象的永久引用,則只要該引用持續存在,它就不會被收集。

您提到的鏈接中的示例是對數據的引用超出範圍時(在他們的示例中,Stack類的E[]數組字段)並且無法收集。

1

它確實有所作爲。

正常情況下,如果將其設置爲空或其他值,並不重要。重新分配objArr可以減少引用計數,並可以對陣列進行GC分析。

但是,如果數組太大以至於無法同時在內存中放入其中的兩個,則可能會有所幫助,因爲如果在調用之前將引用設置爲null,則當前數組可以是GC:在爲下一個數組分配內存之前編輯。

+0

我只是在文章中的例子,其中作者聲稱沒有'array [N] = null;'內存會泄漏困惑我,爲什麼在我的代碼中沒問題,但在他的例子中它是這樣做的問題?這是因爲'pop()'只是返回元素,但不對數組執行任何操作,它是元素賦值? –

+1

他的例子等同於您保留對舊數組的引用。當一個對象從堆棧中彈出時,堆棧不應該保持對該對象的引用,因此'array [N] = null;'。不同之處在於他沒有任何新值(直到有人調用'push'),這就是爲什麼他的代碼賦值爲null。 –