2014-04-16 90 views
0
for(int i = 0; i < len i++) { 
    List<Integer> a = new ArrayList<Integer>(); 
    a.add(1) 
    a.add(2) 
} 

有人告訴我,在這個循環完成後,與a相關的內存將被釋放。在循環過程中,內存分配給一個列表還是len * listmemory?在循環之後釋放的Java for循環中分配的內存?

我的意思是在內存期間使用了多少個字節,如8 * len或只是說8?

在我的項目中,列表非常龐大,所以我想知道,如果我把聲明放在for循環之外,內存使用的使用比這個小得多嗎?

+2

你應該單獨詢問你的'FileChannel'問題。這完全不相關。 –

+0

內存可能在循環之後或下一次循環迭代期間釋放,甚至從不釋放(如果Java從不需要回內存)。垃圾收集是不可預測的。但是:*如果需要的話,它會一直被釋放,而其他任何東西都不會使用它 - 無論運行多少次,您的循環都不會導致OutOfMemoryError。 *如果您稍後有可能使用它,它永遠不會被釋放 - 您永遠無法訪問已釋放的內存。 – immibis

+0

謝謝,fileChannel怎麼樣,如果我在循環中啓動一個新的文件通道,並且不關閉它,會導致內存不足嗎? – user3495562

回答

2

您似乎在分配len列表。通常,您將聲明放在循環之外。此外,你已經放棄了類型說明符(這是給你一個警告,你不應該忽視這些) -

List<Integer> a = new ArrayList<>(); // Or ArrayList<Integer> in Java before 1.7 

for(int i=0; i < len; i++) { // <-- Missing semi-colon after len. 
    // List<Integer> a = new ArrayList(); // <-- define outside the loop. 
    a.add(1); // <-- Missing semi-colon. 
} 

最後,列表a將有資格進行垃圾回收時,它不再可達。在Java中,你沒有明確地管理內存。

編輯)不要緊多少元素在一個循環或以其他方式創建的每個List例如,當基準是無法訪問變得符合垃圾回收。有無法保證什麼時候(或者甚至)會發生垃圾回收。

內存使用情況取決於實現(但我相信默認的ArrayList大小爲10)。每個Integer都是一個4字節整數和一些開銷的包裝器......也許是40位?所以,大約len * 10 * 4字節 - 當然垃圾收集可以在循環過程中的任何時候運行。

+0

我的意思是在內存期間使用了多少個字節,如8 * len或者只是說8? – user3495562

+0

@ user3495562編輯。但是你不能在Java中明確地管理內存,所以它依賴於實現。 –

+0

所以如果我把這個聲明放在循環之外,內存的使用要小得多。對? – user3495562