对于在Java中重用的对象的存储意味着什么?

时间:2013-04-05 21:25:55

标签: java garbage-collection specifications

在Java语言规范的§12.6中,它说:

  

Java编程语言没有指定终结器的使用时间   将被调用,除了说它将在存储之前发生   对象被重用。

对于要重复使用的对象的存储意味着什么?

我是否需要担心在运行时随机发生这种情况(例如:在我使用它时会覆盖某个对象)?如果是这样,我该如何防止这种情况?

5 个答案:

答案 0 :(得分:2)

  

对于要重复使用的对象的存储意味着什么?

     

我是否需要随意担心我的对象发生这种情况   运行时(例如:在我使用它时会覆盖某个对象)?

就我所知,Java的语义不会在任何地方暴露这些现象,所以我认为它并不意味着什么,它是一个实现细节,或者是一个“信息性”评论。

换句话说,这句话:

except to say that it will happen before the storage for the object is reused.

等同于什么都不说,因为它对如何实现符合标准的Java编译器没有任何影响。

答案 1 :(得分:0)

在对象被垃圾收集后,对象的存储被重用,并且用于存储该对象的内存被用于其他事物。

由于这只是在对象被垃圾收集后才会发生,所以它永远不会发生在您仍在使用的对象上。

答案 2 :(得分:0)

我认为“存储”是指用于存储对象的物理堆空间。因此,根据规范,终结器方法可以保证在它所属的对象尚未被覆盖的情况下运行。

如果你正在使用一个对象(即正常引用它),它根本不符合垃圾收集条件,所以你不必担心它。

答案 3 :(得分:0)

将Java“堆”存储视为一堆黑板(或“黑板”或“白板”或其他任何东西,具体取决于您的年龄和您的筹集地点)。

创建对象时,您“声明”其中一个黑板供您使用,并将对象的数据写入其中。为了跟踪它,你将一根绳子贴在它的角落,然后把那根绳子拿在手里。你手里拿着那条绳子作为“参考”。

然后,您可以创建第二个对象(声称不同的黑板),在其上写一个名称,并将第一个字符串的末尾粘贴到该名称旁边的第二个黑板上。该名称是对象中的一个字段,它引用您创建的第一个对象。

只要你有一根绳子可以从一个黑板到下一个黑板到达下一个黑板,你就可以看到你在那个遥远的黑板上写的东西了。

如果您不再需要其中一个黑板,请将它与您的手或其他黑板上的任何地方之间的绳子移除,您可能已将其粘贴。 (这是将引用设置为null。)

当黑板不再有任何字符串通向它时,它可以被看门人删除并提供给需要黑板的​​其他人。当他这样做的时候,他会将那些从黑板上移开的琴弦移到任何其他地方,如果没有其他琴弦到达它们,它们也会被删除。 (他还会仔细弄清楚,例如,是否有两个相互连接的黑板,没有其他字符串到达​​它们。这些也将被删除。)

“终结器”是一张可以粘贴到黑板一侧的说明书。在看门人清除黑板之前,他会阅读该表上的说明并执行所要求的任何操作。

答案 4 :(得分:0)

  

我是否需要担心在运行时随机发生这种情况(例如:在我使用它时会覆盖某个对象)?

不,你没有。

简单来说,如果GC知道没有可能的方式你的(纯Java)应用程序可以再次使用它们 ,那么这些对象只会被覆盖。


详细说明:

对象的存储仅在垃圾收集和完成后重复使用。并且只有在所有可到达的引用丢失/覆盖/遗忘之后,对象才会被垃圾收集。如果对象没有可访问的引用,则应用程序无法使用它: - 它不再知道该对象。

事实上,它有点复杂,因为可达性有不同的“阴影”。例如,等待最终确定的对象是“幻像可达”,并且终结器可以再次“复活”该对象。但除非您正在编写覆盖finalize()的类,否则您不需要了解这一点。要记住的是,只有无法访问的对象才能回收其存储,并且纯Java程序无法查看无法访问的对象的状态是不可能的。