IronPDF 导致内存泄漏

IronPDF Causing a Memory Leak

我正在使用 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 上复制了它。

有没有其他人遇到过这个问题,你是如何解决的?

IronPDF 承认他们的 Chrome 渲染器存在内存泄漏,他们已经解决了这个问题。从版本 2021.11.4257 开始提供修复。

内存泄漏已在 2021-11-15 发布的 IronPdf 更新 2021.11.4257 中得到解决。 https://www.nuget.org/packages/IronPdf/2021.11.4257

  • 修复了内存泄漏(见下面的附图)
  • 添加 Installation.ChromeBrowserLimit
  • 添加 AWS 支持。完整 Docker 设置教程在这里 - https://iron.helpscoutdocs.com/article/115-aws-lambda-amazon-linux-2 (这还不包括对 AWS“层”的支持)
  • 更新了异常消息,以允许开发人员诊断更多问题
  • 几个小错误修复

我们的下一次更新会是什么?(已知问题):

将页眉和页脚应用于页数大于 30 的文档当前会导致问题,因此要成功地将页眉和页脚应用于页数大于 30 的文档,您必须添加 IronPdf.Installation.ChromeBrowserLimit = 50;,其中“50”大于大型文档的预期页数。

内存泄漏多长时间了?

11 月 1 日左右在 IronPdf 2021.11.4183

为什么会这样?

我们的 Chrome 渲染器是相对较新的非托管专有代码。最近的更新导致内存泄漏,由于扩展性能分析不充分而未被捕获。

以后如何预防?

我们已经为我们的“持续集成”流程实施了扩展性能分析,以确保在将 IronPdf 发布到 public.

之前我们的托管和非托管代码性能都达到标准

2 个文件