当分析内存转储时,它显示持有xml内容的这个特定字符串变量导致内存泄漏。我读了一些关于LoH转到第2代的文章。所以,
答案 0 :(得分:0)
但是,如果您的应用程序正在进行分配,那么字符串很可能会存活太久。如果没有足够的内存压力,GC几乎没有理由释放内存。
但请确保不再引用该字符串。计算参考,检查它是否没有实习。
您可以强制进行垃圾收集,但这是破坏GC性能的好方法。如果您的应用程序执行奇怪的操作,它可能是您的案例的最佳解决方案"分配一个巨大的字符串然后忘记它"操作,和你关心系统其他部分可用的内存(你的应用程序没有任何好处)。尽管如此,如果您正在进行大量分配,那么尝试这一点毫无意义 - 在这种情况下,请查找您身边的内存泄漏。 WinDbg可以提供帮助。
答案 1 :(得分:0)
1。如果Gen 0和Gen 1没有压力,垃圾收集器会被调用吗?
如果Generation0
和Generation2
中有足够的空间,则不会调用垃圾收集器。
如果Generation0
和Generation2
中有足够的空间,则意味着有足够的空间来创建新对象,并且没有理由运行Garabage Collection。
2。当它释放Gen 0或Gen 1内存时它会转到Gen 2吗?
如果对象在Generation1
和Generation1
中的垃圾收集后存活,则该对象将移至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
的非常有用的内容,文章是用简单的英文写的。