【问题标题】:How to purposely abandon object for garbage collection. (Java)如何故意放弃对象进行垃圾回收。 (爪哇)
【发布时间】:2016-09-03 12:06:56
【问题描述】:

所以我正在编写自己的 3D 引擎。我将从 OBJ 文件中加载的对象保存在数组列表中。问题是当我从列表中删除对象时,它不会被垃圾收集。它可能仍会在代码中的某处被引用,但搜索起来很麻烦。所以我想知道是否有办法在我删除对象时锁定它,这样每当有东西试图访问它时它就会抛出错误。

一个高多边形网格可能会占用数百兆字节的内存。

谢谢。 (我不想发布代码,因为它非常庞大)

【问题讨论】:

    标签: java memory-leaks garbage-collection finalize


    【解决方案1】:

    这可以通过额外的取消引用来解决。与其将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() 也会引发异常。

    【讨论】:

    • 非常有趣的想法。这就像手动实现墓碑技术。我试试看
    【解决方案2】:

    当对象仍在被引用时,您不能从内存中删除它。

    如果对象的结构是这样的话,您最多可以删除或最小化其内部状态。例如,您可以在 Collections 上调用 clear(),这将从集合中删除所有元素,使其更小。在您的情况下,我想您可以添加一个“无效”方法来执行类似的操作(尽管这可能是一个奇怪的设计,但最好弄清楚该对象仍在使用的位置以及原因)。

    【讨论】:

      【解决方案3】:

      如果您有一个容器,添加一个对象,然后删除该对象,您现在不再拥有对所述对象的引用。

      如果你真的很担心这个参考,或者你复制了它,那么就隐含地= null他们。

      如果您仍然有对它的引用,则抛出的“错误”将是现在的空指针。 (但如果你真的要删除它,你不应该)

      【讨论】:

      • 对象实际上不在任何容器中。创建时,它存储在 ArrayList 中。我确实注意到它引用了一个网格,该网格也引用了对象。由于引用循环,可能无法收集。
      • @JackLe 任何常用的可读现代 JVM 都有一个可以处理引用循环的垃圾收集器。
      • @JackLe 垃圾收集按定义处理周期。 Java 从一开始就是这样做的。
      • @JackLe by container 我的意思是任何东西都可以容纳对象……就像 ArrayList 一样。是的,正如其他人所说,如果不再实际使用,JVM 会处理引用循环。
      • 我尝试在 netbeans 中使用“查找引用”功能,它无法找到和引用,但它仍然存在于内存中的某个位置。证明是该程序仍然在内存中咀嚼一千兆字节(使用任务管理器)。
      猜你喜欢
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 2015-11-05
      • 1970-01-01
      • 2012-03-26
      相关资源
      最近更新 更多