当在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,因为内容没有被复制,f2
和f1
现在都指向同一个东西 m1 或 m2?这是否会导致未使用的内存,直到 GC 执行其操作?
欢迎对此作出任何解释或提出意见。
f2
之前引用的对象无法访问,并将在内存中等待,直到 GC 处理它。
现在从理论上讲,可以在该空间中创建新对象,因为它不再被使用。但是,我不知道有任何GC算法可以执行这种"热交换",并且可能效率低下。该算法将变得更加复杂,并且在内存使用方面的优势将微乎其微。它仍然需要"标记"阶段来识别等待收集的对象。
你是对的。f2 引用的原始对象仍将在堆上,直到 GC 收集它(回收它占用的内存(。因此,f2 将引用与 f1 相同的对象。
正如你所问的:
在 Java 和其他带有垃圾回收器的语言中,语言支持库将回收内存并使其可供重用。
在大:在通常没有垃圾回收器的 C++/C 和语言中,内存会丢失,进程永远无法恢复它。