没有根的托管对象会在下一次 GC 运行 期间被销毁吗?

Will managed objects without roots be destroyed during next GC run?

我正在尝试分析重负载下 .NET Web 应用程序的转储。

通过 WinDbg,我看到我的 GC 堆大约有 1GB。 dumpheap 显示它充满了类似的托管对象,gcroot for which return:

Found 0 unique roots

我的问题是:我能否确定垃圾收集器会在下一个 运行 时销毁没有根的对象,还是内存泄漏的迹象?

Can I be sure that Garbage Collector will destroy objects without roots on the next run?

没有。垃圾收集器可以 运行 用于不同的 generations:0、1 和 2。只有当对象处于同一代或更低代时才会被垃圾收集,GC 运行s 用于:

  • 将始终收集第 0 代对象。
  • 第 1 代对象将在第 1 代和第 2 代 运行 期间收集。
  • 第 2 代对象只会在第 2 代上收集 运行

另外,如果对象有finalizer,它可能运行 1次GC之后,因为finalizer必须在运行之前。但在这种情况下,对象应该被定位到最终队列。

Is it a sign of a memory leak?

没有。特别是如果你有像 string 这样的不可变对象,它们来来去去是正常的(其中许多可能在第 0 代中)。