2

我一直在尝试用 Java 设计一个系统,我可以在其中跟踪从磁盘加载的图像和音频文件等资源,并在没有引用时卸载它们。

在 C++ 中,我可以覆盖删除运算符,以便减少引用。但是 Java 使用自动垃圾收集,当对象没有引用时它会破坏它。

因为我在资源管理器中跟踪所有资源,所以对对象的引用永远不会为空,因此如果不需要资源,将永远不会卸载它们。

有没有办法在没有实体引用的情况下跟踪对象同时删除它们?

我听说解构器不安全,所以这也不是一种选择

4

3 回答 3

3

在资源管理器中使用 Wea​​kRefence,例如 WeakHashMap。

您可以在此处找到对 WeakReferences(和其他参考资料,例如 Softreference)的很好解释:http ://weblogs.java.net/blog/2006/05/04/understanding-weak-references

简单地说:弱引用是不强制对象留在内存中的引用。如果没有对该对象的强引用,但您的资源管理器中仍有弱引用,则该对象仍然有资格进行垃圾回收,并且可以被垃圾回收器删除。

于 2012-05-07T10:59:28.293 回答
1

您可以强制资源的用户在dispose使用完资源后手动使用他们使用的资源,类似于 package.json 中的close()方法java.io

在此类dispose方法中,您可以减少一个计数器,当达到零时,您可以显式释放底层资源。

于 2012-05-07T11:03:30.960 回答
1

Java 7 确实有一种允许基于范围的自动资源管理的巧妙方法,您可以将关闭资源与关闭特定程序范围联系起来。但是,据我了解,由于 Java 对象破坏的不确定性,基于对象的资源管理(您似乎正在描述)是不可能的。

对于更复杂的场景,资源关闭必须发生在资源打开的原始范围之外(例如在另一个线程上或收到事件后),必须执行手动关闭。遗憾的是,引用计数实现(C++ 通用)是不可能的。

于 2012-05-07T11:36:47.310 回答