首页 > 解决方案 > 没有根的托管对象会在下次 GC 运行期间被销毁吗?

问题描述

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

通过 WinDbg,我看到我的 GC 堆大约为 1GB。dumpheap 显示它填充了类似的托管对象,gcroot 为其返回:

Found 0 unique roots

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

标签: .netdebuggingmemorywindbg

解决方案


我可以确定垃圾收集器会在下次运行时销毁没有根的对象吗?

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

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

此外,如果对象有终结器,它可能会在稍后运行 1 次 GC,因为必须先运行终结器。但在这种情况下,对象应该植根于 finalize 队列。

这是内存泄漏的迹象吗?

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


推荐阅读