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

再记一次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服务的负载,又能充分利用客户端的资源,一举两得。

我想明白为什么要带上周鹏而不带易建联了!概述在最新一期的国家队18人集训大名单中,赫然出现了周鹏的名字,这让球迷们展开了激烈的讨论。有一种论调是以周鹏34岁的高龄,应该逐渐淡出国家队,没有必要继续入选。更激烈的一种看法是国米飞升新星面临四种选择无论怎样都将背起2000万价签新春之际,祝大家好事成兔。新年之际,尽管什克里尼亚尔可能的人设崩塌让很多人添堵,但国际米兰还是有一些好消息的。效力于意乙雷吉纳的法比安梅开二度,他以7个进球,成为意乙射手榜前10之滕哈赫没有卡塞米罗我们也可以战胜阿森纳对球队现况满意直播吧1月22日讯在俱乐部官方的比赛日采访中,曼联主帅滕哈赫谈到了球队目前的情况。他表示,在没有卡塞米罗的情况下,球队也能够击败阿森纳。关于球队伤病情况滕哈赫没有什么要更新的,我认冬窗亿元标王蓝军首秀后引热议,从他身上能看到罗本或阿扎尔的影子?这个冬季,国际足坛转会市场上最火的居然是一位22岁,且名不见经传的乌克兰小将顿涅茨克矿工的左边锋穆德里克以7000万欧元的固定转会费3000万欧元浮动条款,总计1亿欧元的身价加盟切实名举报!29岁国脚被小三追情债,个人劣迹曝光,男方报警文江湖独白专栏世界杯结束已有一段时间,可是国足仍然处于混乱的局面,不断有让人诧异的事件出现,前国足主帅李铁涉嫌严重违法被调查,牵扯到还有另外两位重要级人物刘奕和陈永亮涉嫌严重违法被倒数第1,再见火箭!休斯顿看走眼,他和哈登的差距太过于巨大104113,火箭又输了,说实话,火箭现在输球,不会让人感到任何意外,更何况,他们面对的是目前排在西部第7的森林狼。不过,这样的输球,让火箭球迷依旧很失望,尽管大家都很清楚,本赛季437万,再见76人!再次被摆上货架,在哈登身边你本拥有绝佳机会129127,客场战胜国王之后,76人在这波西部5连客的赛程当中,取得了全胜的战绩,他们目前保持着5连胜的节奏,即将回到主场。与此同时,由于雄鹿客场输给了骑士,76人的战绩反超了雄4换1!火箭报价阿奴诺比,筹码诚意满满森林狼今日在主场面对西部垫底的休斯顿火箭打来毫不手软,靠着爱德华兹攻下赛季新高的44分,与当家控卫拉塞尔23分的带领下,以113104胜出,让火箭继续沉沦苦吞13连败。这是爱德华兹难以置信!热刺溃败,凯恩将出走,拜仁有意引进,列维1亿!头条创作挑战赛据欧洲知名媒体电讯报爆料称,热刺当家球星将要出走白鹿巷球场,他无意再和俱乐部续约,而德甲豪门拜仁有意引进他,热刺在上个赛季的表现非常强势,没想到这个赛季交出的成绩让人CBA球星教练女友大对比,谁才是真正的大赢家?CBA第二阶段比赛已经结束了,基本上所有的本土球员都回到了自己家乡,与家人团聚,而此时也正值新春佳节之际,所以不少球迷也是更新了个人社交媒体,向球迷们送出了自己的新春祝福,同时不少摆烂培养新人!湖人拿下158潜力锋线?对纳恩是好归宿150117战胜凯尔特人115109战胜灰熊不同于活塞马刺火箭等肆无忌惮的摆烂,雷霆在遇到强队时还是很好的打出了血性。当然,他们也有资本和强队进行硬碰硬。和上赛季一样,本赛季亚历山
熟女的优雅装扮从1974年第一条意大利本土出品的裹身裙开始,这条裙子就成为女人味的象征。高级的真丝裹身裙就具备这种魔法,任何不完美身材穿上都轻易能够显瘦显高挑显优雅显华美。它给予女人味三字令人心6支夏日绝美口红分享,我不允许你一支都没有那么夏天到了当然是要换一批夏天用的口红啦所以今天,拖拖决定为你们推荐6支超级适合夏天涂的口红让我的仙女可以在人群中脱颖而出!!ColourpopFlifi开架彩妆品牌中的战斗机co生活偶感愿我们既有能力享受安静,又有能力享受真正的狂欢生活中,许多人都有这样的感觉,越是身处热闹的地方越是觉得孤独,越是忙碌的时候越是觉得空虚。现代人似乎特别矛盾,一方面害怕独处,一方面又想着逃离喧嚣。他们害怕独处时的安静,他们也厌倦你若大气,必有福气你若大气,不斤斤计较,必有福气,一个人的福气是在后头,只有靠着自己慢慢地去修,福气才会朝着你一点点地来。人生不要着急,好的事情会一点点地朝着你而来的,可能你当下一无所有,可是有些物乐观所谓乐观,关键是乐观需要如何写。乐观的发生,到底需要如何做到,不乐观的发生,又会如何产生。既然如此,而这些并不是完全重要,更加重要的问题是,我们都知道,只要有意义,那么就必须慎重考学会孤独头条创作挑战赛慢慢的朋友渐行渐远,虽然说有互联网的加持。但是。一如那句老话,远亲不如近邻。再有,互联网也不可能每天都分享生活的琐事,而且环境不一样,烦恼是不一样的。慢慢的,时间也开全国各地开展消费者权益保护活动央视网消息(新闻联播)今天(3月15日)是国际消费者权益日。市场监管总局公布数据,2022年,全国市场监管部门共受理消费者投诉举报和咨询2940。77万件,为消费者挽回经济损失45质量问题频发虚假宣传,新能源车成消费者维权新热点虽然今年315国际消费者权益日到来之前,网上传出将会有新能源车企将被曝光,但实际上,本届315晚会并没有着重关注汽车领域。不过,在过去的一年,针对汽车产品服务贷款等环节的维权事件也全力以赴电动化,宝马首次公布新世代车型产品规划记者从宝马集团获悉,3月15日,宝马集团首次公布新世代车型及产品规划。走量车型打头阵2025年下半年开始量产随后的24个月内至少投产6款车型,宝马集团在今天举行的2023年财报年会保障消费者权益靠什么?公平和诚信是商品经济的主旋律,也是市场经济参与各方必须遵守的共同准则,更是为消费者营造良好消费环境的保障。企业是市场经济中最为活跃的一份子和重要组成部分,应积极承担社会责任,切实履醉酒女子殴打代驾司机我男朋友上海人公安局的,官方回应来了醉酒女子殴打代驾司机我男朋友上海人公安局的,官方回应来了3月14日,上海普陀,一位醉酒女子当街殴打代驾司机的视频登上了热搜,引起了网友们的热议。整个视频长达六分钟,根据现场目击者的