没有根的托管对象会在下一次 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 代中)。
我正在尝试分析重负载下 .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 代中)。