范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

再记一次MemoryLeak分析

  性能是优化出来的,不管是在上生产前,还是在上生产后。大部分性能在性能测试阶段就能发现问题,但也有一些性能问题,结合生产的环境,生产数据才能表现出来,成为一个显著的瓶颈。
  这次是生成pdf造成的内存泄露,大体代码如下,具体表现是内存缓慢增长,在docker中比windows增长速度要快,但都有只增不回收的特点。 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左右。 Address           Kbytes     RSS   Dirty Mode  Mapping 00007f4d54000000   65536   65536   65536 rw---   [ anon ]
  经过一天的测试,找不到具体的问,最后推测是生成Pdf后,生成的内存是非托管内存,GC回收不掉,每当有用户下载PDF时,就会积累内存,直到Pod崩掉。
  干不掉bug,就干掉需求吧,因为经过统计这个下载pdf的使用量很低,可以下掉功能。同时把这个问题给QuestPDF提了个issues。就准备躺平。QuestPDF回应很快,说注册字体只用注册一次就行,多次注册会重复累加字体,37到40行代码,只在服务启动时加载一次即可,经过测试果然有效果。
  在复盘时,总结,常规的思维在win下注册字体,多次注册不会让相同的字体保存多份,从而认知QuestPDF注册也是同理,造成下载一次就注册一次,造成内存积加,这也是为什么65M左右的内存一起在累加的原因。
  后来,我又思考了一下,如果做一个支持高并发,高性能的web服务,像下载Excel,PDF这些操作,是不能在后台生成的,因为用户的一个文件的体积和用户的数据是有关系的,大小很难控件,如果耦合在web服务端来做这件事,肯定是个"雷"。也有的建议是用其他服务或cli异步生成,然后放在云存储上让用户下载,这也是一种解决方案。
  我觉还是让web服务做自己擅长的事,提供数据,把文件生成组装操作转嫁给客户的浏览器来完成,这样既能减轻web服务的负载,又能充分利用客户端的资源,一举两得。

绘制机械键盘PCB简易入门许多人都不喜欢飞线,都在闹着PCB。还出现了PCB很难画之类的言论,所以打算写个教程,教教大家怎么简易绘制键盘的PCB。教程目前来说绘制PCB常用的软件是AltiumDesigne做妈妈需要知道的4件事世界上最美好的称谓是母亲世界上最柔情的臂弯来自母亲母亲的碎碎念念温暖了我们的岁岁年年今天是母亲节法官为母亲们送上普法大礼包用法律守护我们最美的妈妈1hr我是一名准妈妈但是公司最近以只有用过才敢说!这5款奶瓶清洗剂靠实力进决赛圈,宝妈实名推荐宝宝一到三个月时,自身抵抗力差,全靠爸爸妈妈给她在生活的方方面面搭起保护罩。奶瓶清洗剂作为宝宝建筑的第一道保护罩,有很多宝宝跟我家一样免疫力比较差,此时就需要一款好用又安全的奶瓶清去酒店开钟点房的都是什么人,第三种你想不到钟点房是一种按小时收费的房间,是一种灵活的租赁方式,钟点房一般是从早上6点到晚上18点开放,通常为2到6小时左右。那么什么样的人会预订钟点房呢?很多人会猜测这通常是一些小情侣,或者两年亏损13亿,带帽的凯撒旅业还能撑多久?今年五一,国内旅游收入同比减少42。9,仅恢复至疫情前同期的44。0,如果说国内旅游惨遭腰斩,那么出境游则是跌至深渊。在看不到出路的深渊之中,众多出境游相关的企业不得不转身离场,作手机界绝地武士诺基亚1020在如今这个手机拍照已经号称上亿像素的时代,虽然普通手机也就几千万级别,而且还有着多镜头的加持,拍照效果实在是不错的了,但当我回看差不多9年前,却有着一台手机的出世让当时的我则是一惊全球气温从地球形成到现在大概是怎么样的?我们知道地球气温有一年四季起伏变化。现在全球变暖引起了很多人关注地球未来几十年甚至几百年内气候会怎样变化?我们一起来研究解开这个秘密。1原始地球原始地球什么样?因为资料很少,我给大记住这3点,好坏手机立马区分开,看懂就不再被骗随着智能手机时代的到来,越来越多人对智能手机越发依赖,但对于大多数普通用户来说,他们很难从专业角度判别智能手机质量的好坏,如果随意听信销售员工的宣传,则很可能会选择一款性价比较低,5款512GB存储手机,天玑81009000骁龙8A15都在内最便宜的512GB手机motoedgeS30冠军版骁龙888重202g6。8英寸144Hz高刷屏居中挖孔后摄主摄1亿像素1300万像素超广角200万景深前摄1600W33W充电50那些最终成为你刚需的,手机里的功能当下各种手机里的功能五花八门,有哪些功能是大家用过之后再也无法割舍的呢,下面给大家分享一下,我用过的一些非常好的各个品牌硬件和软件功能,不知道能不能引起大家的共鸣。苹果iPhone妈妈坚持做了3件事,2岁宝宝语言实现大爆发,方法可以学起来大家好,我是七悦妈我因为家中有事回了一趟老家,办完事之后刚好时间有空余,于是就约了好久没见的表妹聚餐了一次,表妹带着2岁多的宝宝一起来我家玩,大家玩得很开心。还记得上一次见到宝宝的
80W6000mAh,vivo再现高配低价?仅售1199元起vivo高价低配被喷了好久,但大家应该听过今非昔比这个词,如今的vivo就是这样。其实vivo为了摆脱高价低配也做了很多的努力,其中很重要的是创建了iQOO这个子品牌,由此才算真正80W6000mAh,vivo再现高配低价?仅售1199元起vivo高价低配被喷了好久,但大家应该听过今非昔比这个词,如今的vivo就是这样。其实vivo为了摆脱高价低配也做了很多的努力,其中很重要的是创建了iQOO这个子品牌,由此才算真正儿童脾虚如何调理医学上儿童指014周岁的未成年人,儿童的特点是生长发育,所需的营养均是由消化道进入并转化的,好的消化道环境能提供孩子充足的营养,孩子有精力娱乐和学习,反之则饮食不香,容易疲劳,甚至儿童癫痫治疗需趁早,45岁之前是黄金期癫痫是一种常见的慢性神经系统疾病,据统计,我国整体癫痫患病率约为7,国内现有1000万左右的癫痫患者。其中,有60的患者是起源于儿童时期。癫痫持续发作,不仅会让孩子身心遭受痛苦,还儿童脾虚如何调理医学上儿童指014周岁的未成年人,儿童的特点是生长发育,所需的营养均是由消化道进入并转化的,好的消化道环境能提供孩子充足的营养,孩子有精力娱乐和学习,反之则饮食不香,容易疲劳,甚至儿童癫痫治疗需趁早,45岁之前是黄金期癫痫是一种常见的慢性神经系统疾病,据统计,我国整体癫痫患病率约为7,国内现有1000万左右的癫痫患者。其中,有60的患者是起源于儿童时期。癫痫持续发作,不仅会让孩子身心遭受痛苦,还诺基亚G50独芳自赏骁龙4805000毫安电池1999起外观外观方面搭载6。82英寸720PLCD水滴屏,不支持高刷加高采样率,450nit亮度,NTSC70,厚8。85mm,重220g,拥有海蓝,曙光俩种配色。电池电池方面搭载5000诺基亚G50独芳自赏骁龙4805000毫安电池1999起外观外观方面搭载6。82英寸720PLCD水滴屏,不支持高刷加高采样率,450nit亮度,NTSC70,厚8。85mm,重220g,拥有海蓝,曙光俩种配色。电池电池方面搭载5000年轻消费者对新能源车关注度更高近期,由于汽车消费利好政策频出,不少消费者在选择传统燃油车还是新能源车上犯了难。日前,中国汽车流通协会联合懂车帝发布的新能源与燃油车用户消费行为洞察报告(以下简称报告)显示,随着新年轻消费者对新能源车关注度更高近期,由于汽车消费利好政策频出,不少消费者在选择传统燃油车还是新能源车上犯了难。日前,中国汽车流通协会联合懂车帝发布的新能源与燃油车用户消费行为洞察报告(以下简称报告)显示,随着新把证监会逼上法庭的最强老赖!连续10年造假,却依然活得滋润没想到吧,乐视网还活着,而且生龙活虎,甚至还把证监逼去打官司了老规矩,想提高选股技巧的,图中的文档,si信无偿拿走。证监会追债上法庭先来说个最近发生的事吧,证监会罕见地追债追上了法