释放java中实例控制类中不再需要的对象使用的内存

时间:2013-05-06 16:19:02

标签: java enums instance equals

请考虑以下情形。

您正在使用java构建一个类,其中类的基本语义要求类中没有两个实例的值相等,除非它们实际上是同一个对象(请参阅Joshua中的实例控制类)布洛赫)。从某种意义上说,这就像一个非常大的枚举(可能是数亿个“常量”),直到运行时才知道。因此,回顾一下,您希望类确保堆上没有“相等”的实例。堆上的特定对象可能有很多引用,但没有多余的相等对象。这显然可以在代码中完成,但在我看来,我还没有看到任何地方遇到的一个重大缺陷,包括在Effective Java中。在我看来,为了保证实例控制类必须保持对在程序执行期间任何时候创建的EVER的每个实例的引用,并且永远不能“删除”其中一个对象,因为它永远不会知道不再有任何“指针”到该对象(除了它本身保留的那个)。换句话说,如果你在引用计数的上下文中考虑这个问题,那么在程序中会出现一些问题,即对象的唯一引用是类本身所持有的那个(表示“这是创建的”在某一点”)。此时你想释放与该对象相关联的内存,但是你不能,因为剩下的一个指针无法知道它是最后一个。

有没有一种很好的方法来提供实例控制的类,它还可以释放不再需要的内存?

更新:所以,我认为我发现了一些可能有用的东西。事实证明,java有一个提供弱引用的java.lang.ref类。来自维基百科:“WeakReference用于实现弱映射。一个没有强或软可访问但被弱引用引用的对象称为”弱可达“。弱可达对象在下一个收集周期中被垃圾收集。这种行为在类java.util.WeakHashMap中使用。弱映射允许程序员将键/值对放在映射中,而不用担心当其他地方无法再访问密钥时占用内存的对象。另一个可能的应用程序弱引用是字符串实习池。从语义上讲,弱引用意味着“当在下一个垃圾收集中没有其他任何东西引用它时,摆脱这个对象。”

2 个答案:

答案 0 :(得分:0)

您需要使用其中一个特殊参考对象,例如weak reference。创建它们只是为了支持您提到的用例。

在创建对象时,搜索弱引用集合以查看对象是否已存在;如果是,则返回常规引用。如果没有,则创建它并返回常规引用,并将弱引用添加到您的集合中。

您的弱参考会在您的收藏品以外的任何地方使用时通知您;然后,您可以将其从您的收藏中删除。如果没有任何引用,则可以进行垃圾回收。

一般概念称为“规范化缓存”。

WeakHashMap类是一种快捷方式,可以为您完成一些管道工作。

答案 1 :(得分:0)

目前尚不清楚您的要求是什么。你说你想要数以亿计的恩赐。这表明数据库或NoSQL是存储它的最佳方式。

为确保您没有重复项,您可以跟踪使用WeakHashMap保留的引用对象。