2010-04-30 57 views
1

我正在爲Java中的揹包問題實現一個動態編程算法。我聲明數組,然後將其大小初始化爲[數量對象] [揹包容量]。在Java中刪除數組的一部分以釋放堆上的內存

當我的對象數量或我的容量變得太大時,由於堆空間不足,出現內存錯誤。我的問題是:如果我從我的double數組中刪除行,Java會在我刪除時釋放內存嗎?或者Java爲我最初創建的數組的大小預留內存空間?如果是後者,有沒有辦法在Java中手動釋放內存?

感謝您的幫助!

回答

5

簡短的回答是「是」 - 如果你使用數組是這樣的:

private void foo() { 
    int[][] bar = new int[10][10]; 
    bar[1] = null; 
    //at this point, the array that was in bar[1] is eligible for garbage collection 
    //unless someone else has a reference to it 
} 
+0

但JVM不會將該內存返回給操作系統(至少不是在Windows中),但它會保留它以備將來使用(除非我明白錯誤,OP所需的不是 - mhh可能不是 - ) – OscarRyz 2010-04-30 21:27:00

+0

我已經看到JVM將內存返回到操作系統(Windows XP)。只有當大部分的堆被釋放時。 – 2010-04-30 21:56:59

+0

謝謝!我會盡力而爲,希望它能奏效。 – kate 2010-04-30 22:41:19

1

它應該稍後釋放內存,不一定像刪除行一樣。但是,它會重新使用該內存來存儲新數據。

也許你一起小RAM運行,請嘗試使用它增加:

java -Xmx128m you.app.Main 

這將運行的RAM 128 MB您的應用程序。

+0

只要它可以重新使用內存的新數據我應該沒問題。我希望能夠添加新行,因爲我刪除了舊行。謝謝! – kate 2010-04-30 22:43:50

1

是它的工作原理。 Java沒有多維數組,而只有鋸齒狀數組(數組數組)。 所以第一個數組基本上只是一個指向真實內容數組的指針數組。

與每當您將新陣列分配到其中一個鋸齒形區域時,都可以進行垃圾收集,這具有積極作用。 (請參閱Sbodd回答舉例)

+0

感謝您的解釋。 – kate 2010-04-30 22:42:31

1

從數組的一部分中釋放內存是不可能的......因爲在java中,您不能從數組中刪除元素..相反,您可以橫切該數組,而不是存儲到另一個所需的大小數組...