重新分配引用对象时对内存的影响



当在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 执行其操作?

欢迎对此作出任何解释或提出意见。

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

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

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

正如你所问的:

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

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

最新更新