2010-06-04 70 views

回答

46

停止引用它。

+6

它帶來了我的笑臉:) – BalusC 2010-06-04 12:54:02

+24

Java對象==生存危機「如果沒有人引用我,我還存在嗎?」 – 2010-06-04 13:01:46

+0

單獨留下所有可憐的記憶片段。停止引用它們。現在:) – schnaader 2010-06-04 15:23:14

6

刪除對該字節數組的所有引用。垃圾收集器將負責其餘部分。

13

當創建Java中的一個新的byte [],你這樣做

byte[] myArray = new byte[54]; 

釋放它,你應該做的

myArray = null; 

如果別的引用您的字節數組,像

yourArray = myArray; 

您還需要將其他引用設置爲null,如

yourArray = null; 

在Java垃圾收集是自動的。如果JVM可以檢測到整個程序不再能夠訪問一段內存,那麼JVM將爲您釋放內存。

+2

當感覺像JVM時,JVM將釋放內存。作爲幾乎所有java程序的一階近似,不要擔心內存,不要擔心,JVM會得到回報。 – 2010-06-04 13:10:56

+4

通常,您不需要將引用設置爲null以允許收集對象。如果你需要這樣做,你的實現恕我直言,很可能是一個嚴重的問題。 – 2010-06-04 14:49:36

+3

@彼得:取決於。如果你知道這個變量會比它所指的數組活得長得多,那麼明確地設置它是有意義的。雖然這很少見。 – 2010-06-04 15:24:43

1

將所有對它的引用設置爲null將使它成爲Java自動垃圾收集的候選對象。你不能確定這需要多長時間才能發生。如果您確實需要立即明確回收內存,您可以撥打電話System.gc();

此外,只是要清除您可能不需要顯式地將引用設置爲空。如果引用超出範圍,它們將自動被清空,例如一旦聲明的方法執行完成,局部變量引用將被清零。因此,局部變量通常在應用程序運行時期間隱式釋放。

+3

System.gc()不立即回收內存。你只是告訴JVM「請,如果你喜歡它,也許你可以清理東西。」這只是一個建議。 – 2010-06-04 15:22:02

+3

System.gc()不會強制GC。這僅僅是一個建議。這就像你的室友之間的差異,「老兄,這個地方是一個殘骸,怎麼了?」和你媽媽說「清理這個瞬間!」在大多數實現中,System.gc()僅僅是你的室友。 – 2010-06-04 15:23:15

+0

@Jonathon @Jim我沒有意識到這一點。 javadocs說:「運行垃圾收集器,調用gc方法表明Java虛擬機花費大量的工作來回收未使用的對象,以便使它們當前佔用的內存可以快速重用,當控制從方法調用返回時,Java虛擬機機器盡最大努力從所有丟棄的物體中回收空間。「並以我的稱呼它似乎立即運行的經驗,但也許我錯了 – Alb 2010-06-04 15:44:29