在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完成它的工作吗?
欢迎任何解释或观点。
答案 0 :(得分:3)
f2
之前引用的对象无法访问,并将在内存中等待,直到GC开始处理它。
现在理论上可以在该空间中创建新对象,因为它不再被使用。但是我不知道任何可以进行这种“热交换”的GC算法,它可能效率低下。该算法将变得更加复杂,并且内存使用的优势将是最小的。它仍然需要“标记”阶段来识别等待收集的对象。
答案 1 :(得分:2)
你是对的。 f2引用的原始对象仍将在堆上,直到GC收集它(回收它占用的内存)。因此,f2将引用与f1相同的对象。
答案 2 :(得分:0)
正如你问的那样:
在Java和其他带有垃圾收集器的语言中,语言支持库将回收内存并使其可供重用。
在大: 在C ++ / C和通常没有垃圾收集器的语言中,内存丢失,进程永远无法恢复。