【问题标题】:Does garbage collector free memory on setting _globalObject = new() multiple times垃圾收集器是否在多次设置 _globalObject = new() 时释放内存
【发布时间】:2014-01-21 18:24:26
【问题描述】:

我在多次点击时拨打setABC(id)

MyClass _globalObject;

setABC(id)
{
   _globalObject = new MyClass(id);
}

垃圾收集器是从内存中销毁旧对象并将新对象分配给_globalObject,还是只是创建一个新对象并分配给_globalObject,每次调用 setABC(id) 时都会消耗内存;

(edit) 可能我表述的不好,我不关心GC什么时候发生,而是下面的代码会破坏内存中的旧对象并将新对象分配给_globalObject通过在多次调用中不消耗内存超过一次。

_globalObject = new MyClass(id);

【问题讨论】:

  • 两种说法都是正确的。别担心了。
  • 你的问题有点混乱。您是否想询问是否必须在每次分配给 _globalObject 之前进行垃圾收集?
  • 实际上,它并没有按照您的要求工作。您每次都为新对象分配新引用。 GC 自行运行,而不是在您分配新对象时运行。你的旧类将被标记为收集,当 GC 运行时它将收集它
  • @HenkHolterman 建议的重复对 java 没有帮助,这里是 .Net。虽然我同意概念是一样的。

标签: c# garbage-collection


【解决方案1】:

在分配新引用之前,它不会“销毁”_globalObject 引用的旧对象。

基本上你只会用新的引用覆盖变量的内容。

旧的引用被替换了,因此旧的对象现在在内存中的某个地方,没有对它的活动引用。

在某个时候,垃圾收集器将运行,并重新排列内存,从而重用第一个对象占用的内存。

因此,如果您继续执行该代码,那么暂时您将在内存中拥有 2 个或更多该对象。

【讨论】:

  • 好的,我应该这样做 _globalObject = null 然后 _globalObject = new MyClass() 删除旧引用吗?
  • 不,你根本不能“销毁”那个对象,GC 会处理它。保留代码原样。
  • @ADi 简单。如果您可以从不会被 GC 的代码中访问您的对象,因为您可以访问它。如果你不能,那么它有资格获得 GC(当任何地方都没有更多隐藏引用时)
  • @SriramSakthivel 感谢您的澄清 :)
【解决方案2】:

它会在垃圾收集器运行时清除之前对 _globalObject 的分配,在 GC 运行并清除未引用的对象(在这种情况下,_globalObject 之前指向的 MyClass 的实例)之前,您正在为堆上的每个分配消耗空间)。

如果您想看到这一点,请下载 RedGates ANTS 内存分析器的试用版并将其附加到您的进程中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多