LoH上的.Net垃圾收集

时间:2016-03-21 07:04:52

标签: c# .net garbage-collection

当分析内存转储时,它显示持有xml内容的这个特定字符串变量导致内存泄漏。我读了一些关于LoH转到第2代的文章。所以,

  1. 如果Gen 0和Gen 1没有受到压力且Gen 2因LoH而承受压力,是否会调用垃圾收集器?
  2. 当它释放第0代或第1代记忆时会转到第2代吗?
  3. 如果是这样,处理此问题的更好方法是什么?

2 个答案:

答案 0 :(得分:0)

  1. 不,它不会
  2. 只有在有足够的记忆压力时
  3. 但是,如果您的应用程序正在进行分配,那么字符串很可能会存活太久。如果没有足够的内存压力,GC几乎没有理由释放内存。

    但请确保不再引用该字符串。计算参考,检查它是否没有实习。

    您可以强制进行垃圾收集,但这是破坏GC性能的好方法。如果您的应用程序执行奇怪的操作,它可能是您的案例的最佳解决方案"分配一个巨大的字符串然后忘记它"操作,你关心系统其他部分可用的内存(你的应用程序没有任何好处)。尽管如此,如果您正在进行大量分配,那么尝试这一点毫无意义 - 在这种情况下,请查找您身边的内存泄漏。 WinDbg可以提供帮助。

答案 1 :(得分:0)

1。如果Gen 0和Gen 1没有压力,垃圾收集器会被调用吗? 如果Generation0Generation2中有足够的空间,则不会调用垃圾收集器。

如果Generation0Generation2中有足够的空间,则意味着有足够的空间来创建新对象,并且没有理由运行Garabage Collection。

2。当它释放Gen 0或Gen 1内存时它会转到Gen 2吗?

如果对象在Generation1Generation1中的垃圾收集后存活,则该对象将移至Generation2

3。如果是这样,处理这个问题的更好方法是什么?

  • 要从堆中销毁对象,您应该删除此字符串的引用。具有xml值的string变量不应被static垃圾回收。(read more about roots

  • 尝试使用压缩GCSettings.LargeObjectHeapCompactionMode

    GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; 所以GC.Collect();

这将在执行下一个Full Garbage Collection时压缩大对象堆。在应用设置后调用GC.Collect(),GC会立即压缩。

  • 尝试使用WeakReference

    WeakReference w = new WeakReference(MyLargeObject); MyLargeObject = w.Target as MyLargeClass;

    MyLargeClass MyLargeObject;
    if ( (w == null) || ( (MyLargeObject=w.Target as MyLargeClass) == null) ) { MyLargeObject = new MyLargeClass(); w = new WeakReference(MyLargeObject); }

本文给出了关于Garbage Collection的非常有用的内容,文章是用简单的英文写的。