【问题标题】:do objects created in static class methods get garbage collected?在静态类方法中创建的对象会被垃圾回收吗?
【发布时间】:2014-03-09 21:04:10
【问题描述】:

我正在使用一个有一些方法的静态类,有点像这样:

static class MyClass
{
   public static string SomeMethod()
   {
       SomeObject TheObject = new SomeObject();

       return TheObject.SomeOtherMethod();
}

如您所见,静态方法SomeMethod 实例化一个对象,然后返回。当它返回时,实例化的对象TheObject 是被垃圾回收还是每次MyClass.SomeMethod 运行时都被重新实例化?

谢谢。

【问题讨论】:

  • @ohmusama:当问题是“a 或 b”时,答案怎么可能是“是”?
  • 实际发生的是“a 和 b”。问题是错误的,“是”是正确的。
  • @frenchie A || B 是 YES 意味着 A 是 YES 或 B 是 YES,但是在他的情况下(示例代码),是的,它会被垃圾收集。

标签: c# asp.net


【解决方案1】:

是否存在从代码中任何位置可访问的任何位置(称为 GC 根)对该对象的任何引用?

没有。

那么就可以GCed了。

如果有某种方法可以让您以某种方式获得对该对象的引用,那么它就不能被 GCed。

【讨论】:

  • 可能值得注意的是答案(正确)使用“可以被垃圾收集”而不是像 OP 那样“得到垃圾收集”。
  • 但是,WeakReference 并不完全正确;)
  • 是的,但在这一点上仍然很明确为什么不这样做,所以真的不值得对每条与 GC 相关的评论进行限定,就像你对 C# 所说的几乎任何事情一样通过unsafe 代码违反。
【解决方案2】:

当它返回时,实例化的对象 TheObject 是被垃圾收集还是它得到 每次 MyClass.SomeMethod 运行时都重新实例化?

  • 它可以被 GC 处理,因为没有静态引用(除非显然采用它的方法将它放在某处)。
  • 没有任何东西被重新实例化。新就是新——它不是“NewOrReuse”。

【讨论】:

  • 好吧,new string(new char[0]) 除外。出于某种奇怪的原因,那个 重用了。至少在 Microsoft CLR 中。
  • @JonSkeet:是不是因为微软的实现会自动对字符串进行实习?我很好奇。
  • @AdamSears:我真的不知道。其他字符串不会发生这种情况,甚至以其他方式创建的空字符串也不会发生。这是我喜欢收集的那些有趣的琐事之一:)
  • @JonSkeet:我也会把它放在我的知识库中。 :)
  • 嗨乔恩。你怎么知道它被重复使用了?它是否像具有相同值并因此具有相同实例的常量字符串?
【解决方案3】:

TheObject 是一个包含对SomeObject 实例的引用的局部变量。每次运行该方法时都会分配一个新实例。

假设该引用保持在方法调用的本地(意味着在方法调用结束时没有对该对象引用的外部引用),当方法返回时,由该引用定位的对象实例将有资格进行垃圾回收.

这并不是说它立即被垃圾收集。它有资格进行垃圾收集。如果内存争用较低,则分配的每个此类实例都可以 [理论上] 在进程期间徘徊。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多