我一直在尝试用 Java 设计一个系统,我可以在其中跟踪从磁盘加载的图像和音频文件等资源,并在没有引用时卸载它们。
在 C++ 中,我可以覆盖删除运算符,以便减少引用。但是 Java 使用自动垃圾收集,当对象没有引用时它会破坏它。
因为我在资源管理器中跟踪所有资源,所以对对象的引用永远不会为空,因此如果不需要资源,将永远不会卸载它们。
有没有办法在没有实体引用的情况下跟踪对象同时删除它们?
我听说解构器不安全,所以这也不是一种选择
我一直在尝试用 Java 设计一个系统,我可以在其中跟踪从磁盘加载的图像和音频文件等资源,并在没有引用时卸载它们。
在 C++ 中,我可以覆盖删除运算符,以便减少引用。但是 Java 使用自动垃圾收集,当对象没有引用时它会破坏它。
因为我在资源管理器中跟踪所有资源,所以对对象的引用永远不会为空,因此如果不需要资源,将永远不会卸载它们。
有没有办法在没有实体引用的情况下跟踪对象同时删除它们?
我听说解构器不安全,所以这也不是一种选择
在资源管理器中使用 WeakRefence,例如 WeakHashMap。
您可以在此处找到对 WeakReferences(和其他参考资料,例如 Softreference)的很好解释:http ://weblogs.java.net/blog/2006/05/04/understanding-weak-references
简单地说:弱引用是不强制对象留在内存中的引用。如果没有对该对象的强引用,但您的资源管理器中仍有弱引用,则该对象仍然有资格进行垃圾回收,并且可以被垃圾回收器删除。
您可以强制资源的用户在dispose
使用完资源后手动使用他们使用的资源,类似于 package.json 中的close()
方法java.io
。
在此类dispose
方法中,您可以减少一个计数器,当达到零时,您可以显式释放底层资源。
Java 7 确实有一种允许基于范围的自动资源管理的巧妙方法,您可以将关闭资源与关闭特定程序范围联系起来。但是,据我了解,由于 Java 对象破坏的不确定性,基于对象的资源管理(您似乎正在描述)是不可能的。
对于更复杂的场景,资源关闭必须发生在资源打开的原始范围之外(例如在另一个线程上或收到事件后),必须执行手动关闭。遗憾的是,引用计数实现(C++ 通用)是不可能的。