对象参考变量的重新分配

时间:2019-07-15 18:10:31

标签: java

如果我将其引用变量重新分配给另一个对象,该对象会发生什么? Java如何管理这个现在没有任何引用变量的对象?

对象存在于内存堆中,我尝试但无法找到Java如何管理如下所述的“悬挂”对象。

class Box{...}
...
Box b1 = new Box(); //Instance 1
Box b2 = new Box(); //Instance 2
b1 = b2;
....

在这里您可以看到实例1丢失了其参考变量。这个物体会发生什么? Java / JVM如何管理这种情况(如果万一发生的话)?

4 个答案:

答案 0 :(得分:3)

b1引用的对象将是garbage collected

  

自动垃圾收集是查看堆内存,识别正在使用的对象和未使用的对象以及删除未使用的对象的过程。使用中的对象或引用的对象意味着程序的某些部分仍维护着指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象。因此,可以回收未引用对象使用的内存。

答案 1 :(得分:1)

Java使用垃圾收集自动检测并回收不再引用的对象的内存。实际使用的机制取决于您使用的Java实现。大多数JVM使用不同技术的组合,通常将stop-and-copy collector用于新对象,将mark-and-sweep collector用于寿命较长的对象。如果您想知道它的工作原理,那么这是一个非常有趣的领域,可以深入研究!

答案 2 :(得分:0)

它将由您可以在本文中了解到的垃圾收集器处理

https://stackify.com/what-is-java-garbage-collection/

答案 3 :(得分:0)

垃圾收集器将清理对象不再可访问时占用的内存空间。 可达到只是意味着该对象没有这种引用。 在该示例中,您提供了b2引用的对象将被垃圾回收,因为没有可用于访问该对象的引用,但是如果对该对象有任何其他引用,则不会被垃圾回收,如下面的示例

Box b1 = new Box(); //Instance 1
Box b2 = new Box(); //Instance 2
Box b3 = b2;
b1 = null;
b2 = null;

现在b1引用的对象将被垃圾回收,但b2引用的对象不会被垃圾回收。因为b3在引用该对象,所以b2引用了该对象。