重新分配参考对象时对内存的影响

时间:2018-01-22 12:38:19

标签: java memory reference garbage-collection

在java中使用new关键字时,会分配内存,但我在这里感到困惑:

Foo f1 = new Foo(); //consumes memory m1
Foo f2 = new Foo(); //consumes memory m2
f2=f1; //Now, f2 just points to f1, so what about the memory m2

内存m2是否等待GC,因为内容未被复制,f2f1现在指向m1或m2的相同内容?这会导致未使用的内存,直到GC完成它的工作吗?

欢迎任何解释或观点。

3 个答案:

答案 0 :(得分:3)

f2之前引用的对象无法访问,并将在内存中等待,直到GC开始处理它。

现在理论上可以在该空间中创建新对象,因为它不再被使用。但是我不知道任何可以进行这种“热交换”的GC算法,它可能效率低下。该算法将变得更加复杂,并且内存使用的优势将是最小的。它仍然需要“标记”阶段来识别等待收集的对象。

答案 1 :(得分:2)

你是对的。 f2引用的原始对象仍将在堆上,直到GC收集它(回收它占用的内存)。因此,f2将引用与f1相同的对象。

答案 2 :(得分:0)

正如你问的那样:

在Java和其他带有垃圾收集器的语言中,语言支持库将回收内存并使其可供重用。

在大: 在C ++ / C和通常没有垃圾收集器的语言中,内存丢失,进程永远无法恢复。