Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
释放java中实例控制类中不再需要的对象使用的内存_Java_Enums_Instance_Equals - Fatal编程技术网

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

释放java中实例控制类中不再需要的对象使用的内存,java,enums,instance,equals,Java,Enums,Instance,Equals,考虑以下场景 您正在用java构建一个类,该类的基本语义要求该类的任何两个实例的值都不相等,除非它们实际上是同一个对象(请参阅Joshua Bloch的《有效java中的实例控制类》)。从某种意义上说,这就像一个非常大的枚举(可能有数亿个“常量”),直到运行时才知道。因此,总而言之,您希望该类确保堆上没有“相等”的实例。堆上可能有很多对特定对象的引用,但没有多余的相等对象。这显然可以在代码中完成,但在我看来,有一个主要的缺陷我在任何地方都没有看到,包括在有效的Java中。在我看来,为了保证这一点

考虑以下场景

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

是否有一种好方法可以提供实例控制类,从而释放不再需要的内存?


更新:所以,我想我已经找到了一些可能有用的东西。事实证明java有一个java.lang.ref类,它提供弱引用。来自wikipedia:“弱引用用于实现弱映射。一个不是强或软可访问的对象,但是被弱引用引用的对象称为“弱可访问”"。弱可访问对象在下一个收集周期中被垃圾收集。此行为在类java.util.WeakHashMap中使用。弱映射允许程序员在映射中放置键/值对,而不必担心当键不再可在其他任何地方访问时对象占用内存。弱引用的另一个可能应用是es是字符串intern池。从语义上讲,弱引用意味着“在下一次垃圾收集时,当没有其他对象引用它时,请删除此对象。”

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

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

当弱引用未在集合之外的任何位置使用时,它将通知您;然后您可以将其从集合中删除。如果在任何位置都没有引用,则可以对其进行垃圾收集

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


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

不清楚您的要求是什么。您说您需要数亿个entires。这表明数据库或NoSQL是存储该类的最佳方式


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

这不是问题的答案,但WeakReference是您的朋友。如果WeakReference是最后一个引用,则允许您跟踪某些内容,而无需阻止GC删除该对象。大段文本f谢谢。这看起来正是我想知道的。祝你一切顺利。