【问题标题】:Impact on memory when reference objects are reassigned重新分配引用对象时对内存的影响
【发布时间】:2018-07-01 02:21:04
【问题描述】:

在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 执行其操作之前未使用内存?

欢迎对此的任何解释或意见。

【问题讨论】:

标签: java memory reference garbage-collection


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如你所愿:

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

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

      【讨论】:

        猜你喜欢
        • 2013-08-03
        • 1970-01-01
        • 2019-10-28
        • 2015-10-15
        • 1970-01-01
        • 2019-11-27
        • 1970-01-01
        • 2014-03-17
        • 2014-03-24
        相关资源
        最近更新 更多