0

考虑以下场景。

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

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

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

4

2 回答 2

0

您需要使用一种特殊的引用对象,例如弱引用。创建这些只是为了支持您提到的用例。

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

当您的弱参考未在您的收藏之外的任何地方使用时,您的参考将通知您;然后,您可以将其从您的收藏中删除。在任何地方都没有引用,然后它可以被垃圾收集。

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

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

于 2013-05-06T16:22:13.087 回答
0

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

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

于 2013-05-06T17:26:27.947 回答