簡體   English   中英

如何故意放棄垃圾收集對象。 (JAVA)

[英]How to purposely abandon object for garbage collection. (Java)

所以我正在編寫自己的3D引擎。 我將從OBJ文件中加載的對象保存在數組列表中。 問題是當我從列表中刪除對象時,它不會收集垃圾。 它仍然可以在代碼中的某個地方被引用,但是在搜索時會感到痛苦。 所以我想知道當我刪除它時是否有辦法鎖定對象,這樣每當有人試圖訪問它時它都會拋出錯誤。

高多邊形網格在內存中可能占用幾百兆字節。

謝謝。 (我不想發布代碼,因為它非常龐大)

這可以通過額外的解除引用來解決。 不是將BigObject存儲在集合中,而是存儲對象的“信封”,並添加release()操作以刪除對實際對象的唯一引用:

interface MyInterface {
    void usefulOperation();
}
class VeryBigObject implements MyInterface {
    public void usefulOperation() {
        ...
    }
}
class BigObjectEnvelope implements MyInterface {
    private MyInterface inner = new VeryBigObject();
    public void usefulOperation() {
        inner.usefulOperation();
    }
    public void release() {
        inner = null;
    }
}

創建BigObjectEnvelope對象的集合,並通過其MyInterface接口使用它們。 完成對象后,調用release() 即使你在其他地方有對BigObjectEnvelope其他引用,在它上面調用usefulOperation()也會引發異常。

在仍然被引用時,您無法從內存中刪除該對象。

如果對象以這種方式構造,那么您可以做的最多就是刪除或最小化其內部狀態。 例如,您可以在集合上調用clear() ,這將刪除集合中的所有元素,使其變得更小。 在你的情況下,我想你可以添加一個“無效”的方法來做類似的事情(雖然這可能是一個奇怪的設計,但確實最好找出對象仍在使用的位置和原因)。

如果你有一個容器,添加一個對象,然后刪除該對象,你現在不再有對所述對象的引用。

如果您真的擔心引用,或者您復制了它,那么只是隱式地= null它們。

如果您仍然有引用它,那么拋出的“錯誤”將是現在的空指針。 (但如果你真的想刪除它,你不應該)

暫無
暫無

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

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