簡體   English   中英

如何銷毀java對象?

[英]How to destroy java objects?

好吧,我開發了一個使用多個對象關系的 Java 應用程序,這些關系使內存使用成本過高。 我沒有管理 java 內存的經驗,因為應用程序設計使得銷毀對象和重新利用先前清除的空間變得困難。 例如,我正在使用觀察者和 MVC 模式。

所以,理論說..

如果對象無法從任何活動線程或任何靜態引用訪問,則該對象有資格進行垃圾收集或 GC

換句話說,如果一個對象的所有引用都為空,則可以說該對象有資格進行垃圾回收。

但是,根據我的短暫經驗,當您遇到像我這樣的場景時,如果您不知道如何從我想從內存中刪除的對象的所有引用(例如,當一個框架關閉時),對我來說這太困難了存在許多對您的類的引用。

根據這個上下文,當有多個引用時如何處理對象銷毀? 或者當您對彼此有復雜的引用時,我需要如何管理內存?

注意動向

根據這個上下文,當有多個引用時如何處理對象銷毀?

通過確保不再需要這些引用。

如果您將它們隔離開來,即使是在不再連接到主程序的未使用對象的大隔離圖中,它們也都有資格進行垃圾收集

如果局部變量沒有被“鏈接”到其他任何東西(添加到集合、復合等......) . 對於 UI 對象,在對象圖方面確實很難推理,請確保正確處理它們或閱讀文檔以確保它們會自然處理。

JVM 中引用計數的簡化視圖

“讓 [GC] 一個人待着!!”

或者當您對彼此有復雜的引用時,我需要如何管理內存?

您無法“管理”內存。 您可以簡單地管理參考。 這個想法是通過簡單地不引用它們來“嚴重”你與對象的連接。 然后它們會一直存在於內存中,直到 GC 消滅它們。

不要試圖弄亂 GC 來強迫它做事。 這是一個相當聰明的野獸,雖然您可以嘗試指示它顯式地對某些請求做出反應 - 它可能會忽略您 - 這通常是一個壞主意不要顯式調用 GC如果您不理解,請避免終結器和顯式清零它們的含義


注意回答你的評論

簡單地將已添加到多個集合或組合中的對象引用歸零不會使其符合集合條件。 通過這樣做, 您只會將一個 reference 置空

您確實需要從所有引用它的列表或容器中刪除這個對象(基本上,讓他們“忘記”這個對象)。 一旦沒有對象仍然“記住”或與您創建的對象有“鏈接”,它就會成為垃圾收集器圖中的一個單獨項目,這使其成為刪除的候選對象。

也許這聽起來很乏味,但是如果您從手動管理內存的語言(C 或 C++,以命名最明顯的 2 個引用)來考慮它,則指向動態分配對象的釋放和空指針確實會破壞它們,但您仍然需要從列表(或任何容器)中刪除元素,否則它們看起來就像空桶一樣指向空指針。


進一步閱讀

Java垃圾收集的全部意義在於您不必做任何事情。 垃圾收集已為您完成。

將您希望 GC 收集的每個引用分配給null

你可以做的是做一個中級班。 例如,如果你有一個類 A 的實例,你有很多引用,你想刪除它,但很多引用使它變得困難,你可以執行以下操作:創建類 B 的實例,除了對 A 類實例的引用(如某種代理)。 現在您將有很多對 B 類實例的引用,但只有一個對 A 類實例的引用,您可以輕松刪除它們,垃圾收集器將收集類 A 的實例。

圖像顯示了使用代理時的不同(B 類實例):現在只需要刪除一個引用。

在此處輸入圖片說明

在大多數情況下,GC 會及時發揮作用。

您可能會遇到這樣一種情況,例如,一個視圖正在觀察一個模型,而您想放棄該視圖但保留該模型。 在這種情況下,您需要記住觀察者回調對象,並在丟棄視圖時將其刪除。 您不必為每個觀察者設置特殊字段 - 一組取消注冊回調的任務就可以了。 或者,更復雜的是,您可以在從底層解壓縮的模型上設置一個瞬態間接層。 我建議避免使用一種或另一種弱引用的奇怪東西。

如果您可能有終結器(或需要某種弱映射驅逐),例如可能使用 java.awt.Frame,您可能需要資源和內存豬之間的間接層,可以簡單地將其清除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM