2017-04-15 45 views
-1

我有這個代碼片段如何釋放內存在Java中

A = new int[100]; 
B = new int[100]; 
C = boolean[100]; 

for(int i=1;i<=10000000;i++) 
{ 
    A = new int[100]; 
    B = new int[100]; 
    C = boolean[100]; 

    // Do Something 

    // Now i don't need A,B,C Array 
} 

多少次我使用內存來創建數組,我可以有效地使用內存?我不需要以前的數組,我只需要當前的數組。

我不想使用任何額外的內存來存儲以前的數組?我的代碼內存是否有效?

+0

我認爲這段代碼是方法的一部分?如果是這樣,只要代碼離開方法,'A','B'和'C'就會超出範圍。垃圾收集器會照顧它,所以你很好。當然,你總是可以明確地將它們設置爲'null'。 – domsson

+0

查看* java垃圾收集器*瞭解對象的管理方式。原始類型變量在超出範圍時被刪除。 –

+0

請按照命名約定。 –

回答

8

只要ABC超出範圍,這些就有資格進行垃圾回收。在你的例子中,這意味着在for聲明的末尾。

現在,如果這些都沒有任何其他變量的引用,你可以讓他們有資格成爲垃圾使用後,沒有將它們設置爲null等待for發言結束時收集現在;

A = new int[100]; 
B = new int[100]; 
C = boolean[100]; 

// processing where these are required 
... 
// processing where these are not required 
A = null; 
B = null; 
C = null; 

這並不意味着它會釋放內存,但現在至少這些對象將被視爲GC的下一個集合中使用。

EDIT

最近JVM版本執行在運行時(JIT)的多個優化。
你可以在Oracle網站上找到關於Just-In-Time Compilation and Optimization的一些解釋。
您也可以在同一頁上找到some examples of JRockit optimizations runtime

因此,根據使用的JVM版本,對null的分配可能是無用的,因爲一旦這些對象不再在其範圍內使用時,JVM就可能認爲這些對象超出了範圍,因此在for聲明。

The Stephen's answer足夠接近的問題表明它。
不幸的是,我還沒有找到關於這個特定優化的具體信息。

+3

沒有必要將引用賦給null。當垃圾收集器超出範圍並且垃圾收集器需要時,它們將被收集垃圾。這是不可預測的。 –

+2

@Federico Peralta Schaffner當然,如果範圍的末尾在執行代碼中是「很遠」的話,那麼這些對象將保留爲引用,並且可能不會收集,而這些不是必需的。這是OP的用例。 – davidxxx

+1

@Federico Peralta Schaffner「只要A,B和C超出範圍,這些就有資格被垃圾收集。在你的例子中,它意味着在for語句的末尾。」是我答案的第一句話。 – davidxxx