我正在使用 IronPDF 生成 PDF 文档。我的程序是托管在 IIS 上的 Web 应用程序,它使用 ChromePdfRenderer 使用 HTML 字符串呈现 PDF,并按顺序生成一堆文档。我注意到随着时间的推移,进程使用的总内存增加并最终崩溃。进一步调查显示,非托管内存在生成 PDF 时不断增加。
我编写了一个示例控制台应用程序来复制它
public class PdfBenchmark{
private static readonly ChromePdfRenderOptions ChromePdfRenderOptions = new ChromePdfRenderOptions
{
PaperSize = IronPdf.Rendering.PdfPaperSize.Letter,
CssMediaType = IronPdf.Rendering.PdfCssMediaType.Screen,
PrintHtmlBackgrounds = true,
FitToPaper = true,
EnableJavaScript = true,
RenderDelay = 200,
Timeout = 60
};
public async Task<Stream> SimplePdf()
{
var renderer = new IronPdf.ChromePdfRenderer()
{
RenderingOptions = ChromePdfRenderOptions
};
renderer.RenderingOptions.HtmlHeader.MaxHeight = 25;
renderer.RenderingOptions.HtmlHeader.DrawDividerLine = false;
renderer.RenderingOptions.HtmlHeader.HtmlFragment = HeaderHTML;
renderer.RenderingOptions.HtmlFooter.MaxHeight = 12;
renderer.RenderingOptions.HtmlFooter.DrawDividerLine = true;
renderer.RenderingOptions.HtmlFooter.HtmlFragment = FooterHTML;
using (var x = await renderer.RenderHtmlAsPdfAsync("<h1>Html with CSS and Images and js</h1>"))
{
return x.Stream;
}
}
public const string FooterHTML = @"<div class='container-fluid'>some html</div>";
public const string HeaderHTML = @"<div class='container'>
<div class='row header d-flex justify-content-between'>
<div class='col-md-1 logo'>
</div>
<div class='col text-end right'>
<div>>some HTML content</div>
</div>
</div>
</div>";
}
}
static async Task Main(string[] args)
{
var x = new PdfBenchmark();
for (int i = 0; i < 200; i++)
{
using var stream = await x.SimplePdf();
//Do whatever I want here...
Console.WriteLine($"Created doc#: {i}");
}
}
HTML 越大,内存使用量增长得越快。这是内存分析器快照。
您可以看到非托管内存如何快速增长,但在大约 100 次迭代后仍未释放。我已经在 .NET Core 3.1 和 .NET Framework 上重现了这一点。
有没有其他人有这个问题,你是如何解决这个问题的?