iText 8 ConvertToPDF 内存泄漏问题 Net 8

问题描述 投票:0回答:1

我们有一个程序可以根据输入的信息创建 PDF。生成的 PDF 范围从单页到 1000 多页。我们之前使用 Net 6 和 iText7.pdfhtml - 4.0.2 没有任何问题,但是在升级到 Net 8 和 iText7.pdfhtml - 5.0.3 后,我们注意到生成 PDF 时内存使用量出现峰值(PDF 越大)大小越大,内存使用量越大)。当

时会出现内存使用高峰
HtmlConverter.ConvertToPdf(html, pdfDocument, properties);

被称为。创建 PDF 期间使用的内存在完成后不会被释放。

在我们的 IIS 服务器上,使用的内存存储在第 2 代堆中,并且不被垃圾收集器收集。最终我们的服务器将耗尽内存并且应用程序池将重新启动。

if (!string.IsNullOrEmpty(html))

{

    using (var workStream = new MemoryStream())
    
    using (var pdfWriter = new PdfWriter(workStream))
    
    {
    
        var watermark = isDraft ? "DRAFT" : string.Empty;
        
        ConverterProperties properties = new ConverterProperties();
        
        PdfDocument pdfDocument = new PdfDocument(pdfWriter);
        
        if (landscape)
            
            pdfDocument.SetDefaultPageSize(PageSize.A4.Rotate());
            
            PdfDocEventHandler handler = new PdfDocEventHandler(formDocument.ConfirmationID, formDocument.SubmittedDate, watermark);
            
            pdfDocument.AddEventHandler(PdfDocumentEvent.END_PAGE, handler);
            
            HtmlConverter.ConvertToPdf(html, pdfDocument, properties);
            
            pdfOut = AddPageNumbers(workStream.ToArray(), formDocument.ConfirmationID, formDocument.SubmittedDate);
    }
}

使用 NetBrains,我们能够识别内存使用的主要罪魁祸首来自 iText.Layout.Borders,其中“set_Capacity”试图获取 28GB 内存。

NetBrains - set_Capacity size

在整个 PDF 创建过程中,我们的第 2 代堆持续稳定增长,并且垃圾收集永远不会减少堆的大小。

Generation 2 heap growth

我们的研究一直无法找到解决方案。有没有人遇到过类似的问题/知道为什么会发生这种情况?

itext itext7
1个回答
0
投票

如果您提供一个 html 文件来重现,将会有很大帮助。如果问题无法重现,那么 PdfDocEventHandler 的代码也会很有用。

© www.soinside.com 2019 - 2024. All rights reserved.