我有一个ASP.NETCore3.0API应用程序,它返回一个WPF页面的PDF文件。它自己生成WPF页面,然后将其转换为XPS,这样我就可以将其转换为PDF,但当它完成加载时,API不会将其从内存中释放,因此它只是在崩溃之前不断累积。我已经实现了GC.collect,每次它生成PDF时都是如此,但没有真实的成功。
类i用于使用IDisposable从WPF应用程序生成PDF第一个
0pizxfdo1#
您可能面临的问题是大型对象堆的碎片(洛)。文章The Dangers of the Large Object Heap很好地解释了这个问题。我们在一个生成PDF文件的REST-api中遇到了同样的问题。问题是,使用的byte[]很可能大于85 kb,这将导致它被置于洛。您对GC.Collect();的调用将在堆的第0代上启动垃圾收集。如果您希望防止这种碎片的发生,您应该在调用GC.Collect();之前设置GC选项,如How to (not) use the large object heap in .Net中的"消除大型对象堆碎片“中所述因此,基本上用以下内容替换您的GC呼叫:
byte[]
GC.Collect();
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; GC.Collect(generation: 2, GCCollectionMode.Forced, blocking: true, compacting: true); GC.WaitForPendingFinalizers(); GC.Collect(generation: 2, GCCollectionMode.Forced, blocking: true, compacting: true);
1条答案
按热度按时间0pizxfdo1#
您可能面临的问题是大型对象堆的碎片(洛)。文章The Dangers of the Large Object Heap很好地解释了这个问题。我们在一个生成PDF文件的REST-api中遇到了同样的问题。问题是,使用的
byte[]
很可能大于85 kb,这将导致它被置于洛。您对GC.Collect();
的调用将在堆的第0代上启动垃圾收集。如果您希望防止这种碎片的发生,您应该在调用GC.Collect();
之前设置GC选项,如How to (not) use the large object heap in .Net中的"消除大型对象堆碎片“中所述因此,基本上用以下内容替换您的GC呼叫: