首页 > 社交 > 科普中国

再记一次Memory

常驻编辑 科普中国 2022-10-11 字体   内存   性能   操作   代码   发现   文件   测试   数据   用户

性能是优化出来的,不管是在上生产前,还是在上生产后。大部分性能在性能测试阶段就能发现问题,但也有一些性能问题,结合生产的环境,生产数据才能表现出来,成为一个显著的瓶颈。70r拜客生活常识网

这次是生成pdf造成的内存泄露,大体代码如下,具体表现是内存缓慢增长,在docker中比windows增长速度要快,但都有只增不回收的特点。70r拜客生活常识网

using System.Data;
using System.Reflection.Metadata;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
using QuestPDF.Fluent;
using QRCoder;
using Microsoft.AspNetCore.Mvc;
using QuestPDF.Drawing;
using QuestPDF;


var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();


app.MapGet("/getpdf", () =>
{
    var table = new DataTable();
    for (var i = 0; i < 10; i++)
    {
        table.Columns.Add(i.ToString());
    }
    for (var row = 0; row < 1000; row++)
    {
        table.Rows.Add(row.ToString(), row.ToString(), row.ToString(), row.ToString(), row.ToString(), row.ToString(), row.ToString(), DateTime.Now + "wwewrwerewfdsfdswefwefewfwefwefew" + row, row.ToString(), row.ToString());
    } 
    return TypedResults.File(GetPDF(table), contentType: "application/pdf", fileDownloadName: "a.pdf");
});


app.Run();
static IContainer CellStyle(IContainer container)
{
    return container.DefaultTextStyle(x => x.SemiBold().FontSize(11)).PaddingVertical(5).BorderBottom(1).BorderColor(Colors.Black);
}
static byte[] GetPDF(DataTable dt)
{
    var doc = QuestPDF.Fluent.Document.Create(container =>
    {
        using var stream = File.OpenRead(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "fonts", "MEIRYO.TTC"));
        FontManager.RegisterFont(stream);
        Settings.EnableCaching = true;
        Settings.EnableDebugging = false;
        container.Page(page =>
        {
            page.Size(PageSizes.A4);
            page.Margin(2, Unit.Centimetre);
            page.PageColor(Colors.White);
            page.DefaultTextStyle(x => x.FontSize(14).FontFamily("Meiryo"));
            page.Content()
                .PaddingVertical(1, Unit.Centimetre)
                .Column(x =>
                {
                    x.Item().Table(table =>
                    {
                        table.ColumnsDefinition(columns =>
                        {
                            for (var i = 0; i < dt.Columns.Count; i++)
                            {
                                columns.RelativeColumn();
                            }
                        });
                        table.Header(header =>
                        {
                            foreach (DataColumn col in dt.Columns)
                            {
                                header.Cell().Element(CellStyle).Text(col.ColumnName);
                            }


                        });
                        foreach (DataRow row in dt.Rows)
                        {
                            for (var i = 0; i < dt.Columns.Count; i++)
                            {
                                if (i == 7)
                                {
                                    byte[] qrCodeAsBitmapByteArr = PngByteQRCodeHelper.GetQRCode(row[i].ToString(), QRCodeGenerator.ECCLevel.Q, 20, false);
                                    using var ms = new MemoryStream(qrCodeAsBitmapByteArr);
                                    table.Cell().Image(qrCodeAsBitmapByteArr);
                                }
                                else
                                {
                                    table.Cell().Element(CellStyle).Text(row[i].ToString());
                                }
                            }
                        }
                    });
                });
            page.Footer()
                .AlignCenter()
                .Text(x =>
                {
                    x.Span("Page ");
                    x.CurrentPageNumber();
                    x.Span("/ ");
                    x.TotalPages();
                });
        });
    });
    return doc.GeneratePdf();
}

各种.net的调试工具用上,都只能证明内存只增不减,连pmap都用上了,发现下面的一个大文件的内存占用,并且很多,大体都是在65M左右。70r拜客生活常识网

Address           Kbytes     RSS   Dirty Mode  Mapping
00007f4d54000000   65536   65536   65536 rw---   [ anon ]

经过一天的测试,找不到具体的问,最后推测是生成Pdf后,生成的内存是非托管内存,GC回收不掉,每当有用户下载PDF时,就会积累内存,直到Pod崩掉。

相关阅读:

  • ps怎么把字体变模糊(ps怎样提取原图片字体)
  • 怎么在ps里添加字体(ps怎么添加字体包)
  • 手账字体怎么写(手帐工具大全)
  • 心怎么写(字体设计)
  • 微信字体怎么改艺术字(苹果怎么换个性字体)
  • 字体在哪个文件夹(电脑c盘字体文件夹在哪里)
  • 字体软件哪个好(免费字体下载)
  • 常用字体有哪些(字体样式有哪些)
  • 字体有哪些种类(适合女生练的小清新字体)
  • 哪里下载字体(ps怎么用下载的字体)
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。