记一次 .NET 某电商定向爬虫 内存碎片化分析
一:背景
1. 讲故事
上个月有位朋友wx找到我,说他的程序存在内存泄漏问题,寻求如何解决? 如下图所示:
从截图中可以看出,这位朋友对 windbg 的操作还是有些熟悉的,可能缺乏一定的实操经验,所以用了几个命令之后就不知道怎么排查下去了。
既然找到我,那就以我的个人经验在他的dump上继续分析寻找罪魁祸首,闲话不多说,上windbg说话。
二:Windbg 分析
1. 真的存在内存泄漏吗?
追这个系列的朋友应该知道,我无数次的用 !address -summary
和 !eeheap -gc
这两个命令来判断当前的内存泄漏是属于托管层还是非托管层。
0:000> !address -summary--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Free 358 7dfc`67f60000 ( 125.986 TB) 98.43%
<unknown> 1087 203`88b6e000 ( 2.014 TB) 99.99% 1.57%
Image 1532 0`09f11000 ( 159.066 MB) 0.01% 0.00%
Heap 249 0`03453000 ( 52.324 MB) 0.00% 0.00%
Stack 66 0`01fc0000 ( 31.750 MB) 0.00% 0.00%
Other 10 0`001d1000 ( 1.816 MB) 0.00% 0.00%
TEB 22 0`0002c000 ( 176.000 kB) 0.00% 0.00%
PEB 1 0`00001000 ( 4.000 kB) 0.00% 0.00%--- Type Summary (for busy) ------ RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_MAPPED 183 200`00d06000 ( 2.000 TB) 99.30% 1.56%
MEM_PRIVATE 1252 3`8d479000 ( 14.207 GB) 0.69% 0.01%
MEM_IMAGE 1532 0`09f11000 ( 159.066 MB) 0.01% 0.00%--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_FREE 358 7dfc`67f60000 ( 125.986 TB) 98.43%
MEM_RESERVE 749 200`28a9b000 ( 2.001 TB) 99.33% 1.56%
MEM_COMMIT 2218 3`6f5f5000 ( 13.740 GB) 0.67% 0.01%0:000> !eeheap -gc
Number of GC Heaps: 1
generation 0 starts at 0x00000026DA8DA928
generation 1 starts at 0x00000026DA7FC348
generation 2 starts at 0x00000024C4691000
ephemeral segment allocation context: nonesegment begin allocated size
00000024C4690000 00000024C4691000 00000024D468FF28 0xfffef28(268431144)
00000024EECF0000 00000024EECF1000 00000024FECF0000 0xffff000(268431360)
000000248D6F0000 000000248D6F1000 000000249D6EFEF8 0xfffeef8(268431096)
...
00000026D66D0000 00000026D66D1000 00000026DBA3CA30 0x536ba30(87472688)
Large object heap starts at 0x00000024D4691000segment begin allocated size
00000024D4690000 00000024D4691000 00000024DC67C318 0x7feb318(134132504)
00000024E60F0000 00000024E60F1000 00000024EE0637C8 0x7f727c8(133638088)
0000002482140000 0000002482141000 000000248A08F338 0x7f4e338(133489464)
00000024A6770000 00000024A6771000 00000024AE76F6C0 0x7ffe6c0(134211264)
...
000000278E6D0000 000000278E6D1000 000000279635F2D0 0x7c8e2d0(130605776)
00000029233E0000 00000029233E1000 000000292AF672F8 0x7b862f8(129524472)
000000292B3E0000 000000292B3E1000 0000002931A5ED60 0x667dd60(107470176)
000000299B3E0000 000000299B3E1000 00000029A20095B0 0x6c285b0(113411504)
000000281E6D0000 000000281E6D1000 0000002825CD3F58 0x7602f58(123744088)
00000028266D0000 00000028266D1000 000000282D5CAD50 0x6ef9d50(116366672)
000000282E6D0000 000000282E6D1000 0000002833CA0880 0x55cf880(89979008)
00000029A33E0000 00000029A33E1000 00000029A684D300 0x346c300(54969088)
Total Size: Size: 0x353f96d88 (14293757320) bytes.
------------------------------
GC Heap Size: Size: 0x353f96d88 (14293757320) bytes.
从输出看,当前进程占用 MEM_COMMIT=13.7G
,托管堆内存占用 14293757320 = 13.3G
,很明显这属于简单模式的 托管内存泄漏
,根据经验,托管堆上可能有什么大对象,这里用 !dumpheap -stat
命令。
0:000> !dumpheap -stat
Statistics:MT Count TotalSize Class Name
00007ff9ed6ea268 3956842 94964208 System.Collections.Generic.Dictionary`2+KeyCollection[[System.String, System.Private.CoreLib],[Serilog.Events.LogEventPropertyValue, Serilog]]
00007ff9ed5e6d28 3842435 166405016 Serilog.Parsing.MessageTemplateToken[]
00007ff9ed5e5e28 3842434 184436832 Serilog.Events.MessageTemplate
00007ff9ecccf090 4011012 203304420 System.Int32[]
00007ff9ed647078 3956849 253238336 Serilog.Events.LogEvent
00007ff9ed6e7b48 3956849 284893128 System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[Serilog.Events.LogEventPropertyValue, Serilog]]
00007ff9ed5e74e8 9259598 296307136 Serilog.Parsing.TextToken
00007ff9ed6471b0 12551808 301243392 Serilog.Events.ScalarValue
00007ff9ed6e8308 3956849 729078048 System.Collections.Generic.Dictionary`2+Entry[[System.String, System.Private.CoreLib],[Serilog.Events.LogEventPropertyValue, Serilog]][]
00007ff9eccb1e18 16546412 3987811940 System.String
00000024c3b8faf0 82904 7382993568 Free
我去,托管堆最大的对象居然是 Free
,大概占用 7.3G
, 这就
记一次 .NET 某电商定向爬虫 内存碎片化分析相关推荐
- 【项目实战】Python实现基于LDA主题模型进行电商产品评论数据情感分析
说明:这是一个机器学习.数据挖掘实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 视频: Python实现基于LDA模型进行电商产品评论数据情感分析 ...
- 记一次应急响应之ssh日志和apache2日志分析
文章目录 学习笔记连接 第一部分 查看系统情况 0x01 查看端口 0x02 账号安全 0x03 查看ssh日志信息 第一步 查看登陆成功的日志 第二步 查看正常退出的日志 第三步 连接到服务器,提示 ...
- 基于电商数据的用户行为分析之需求分析
电商用户行为分析需求分析说明书 项目名称: 电商用户行为分析 修订时间: 2021-05-28 修订版本: 1.0 一.引言 1.目的 通过编写需求分析文档,对基于电商数据的用户行为分析系统进行介绍, ...
- Linux下电骡aMule Kademlia网络构建分析2
读代码读到现在,补充一点关于Kademlia网络的理论知识. Kademlia网络的基本原理 Kademlia 是一种结构化的覆盖网络(Structured Overlay Network).所谓覆盖 ...
- Linux下电骡aMule Kademlia网络构建分析3
将本节点加入Kademlia网络 连接请求的发起 aMule在启动的时候,会起一些定时器,以便于定期的执行一些任务.其中比较重要的就是core_timer,相关code如下(amule-2.3.1/s ...
- Linux下电骡aMule Kademlia网络构建分析4
aMule中联系人的管理 aMule中主要通过CContact,CRoutingBin和CRoutingZone这样几个类来管理它的联系人. CContact表示一个联系人,它包含了与一个联系人有关的 ...
- Linux下电骡aMule Kademlia网络构建分析5 —— 资源的发布
资源发布请求消息的发送 在aMule中,主要用CSharedFileList class来管理共享给其它节点的文件.如我们前面在 Linux下电骡aMule Kademlia网络构建分析3 一文中分析 ...
- 数据挖掘实战—电商产品评论数据情感分析
文章目录 引言 一.评论预处理 1.评论去重 2.数据清洗 二.评论分词 1.分词.词性标注.去除停用词 2.提取含名词的评论 3.绘制词云查看分词效果 三.构建模型 1.评论数据情感倾向分析 1.1 ...
- 记一次使用开源代码的微博爬虫的经历
记一次使用开源代码的微博爬虫的经历 开源可以让我们的生活更佳美好.之前一直打算把写一个的新浪微博爬虫,然后将数据存入数据库,从而以支持我后续的科研数据分析. 最初,我去看看了微博官方提供的开发者API ...
最新文章
- 使用iphone功能来实现远程监控
- qstringlist格式怎么写到txt_进阶能力 | 一招解决TXT电子书乱码问题
- hbase shell 查看列名_hbase shell 命令行的操作
- Gym - 101889I Imperial roads(最小生成树+树链剖分+线段树)
- 如何使用Kubernetes里的NetworkPolicy
- oracle or索引失效,以下Oracle错误意味着什么:无效的列索引
- 裁剪左上角x左上角y填什么_少了立体裁剪,你的服装设计生涯还完整吗?
- 亚信数据吴岸城:保险行业大数据应用
- 6.0后,全局悬浮窗或者弹窗不显示的解决办法
- 二阶系统级联_二阶系统时域特性.ppt
- 侯捷老师英中繁简术语对照表
- C语言求若干个数的均值和方差
- Excel从入门到精通--基础篇
- MySQL的COUNT语句--count(*)、 count(常量)、 count(列名)
- Win11 Wifi消失,网络适配器黄色感叹号解决方案
- 新手应该如何学习SEO优化
- 4.12 使用格式刷实现单元格样式的快速复制 [原创Excel教程]
- Phonegap事件之pause事件
- Python爬虫项目分享二:《爬取周杰伦的歌曲评论》
- Kali下压缩解压缩命令大全zip、gz、tar、tar.gz、bz2、tar.bz2、bz、tar.bz、Z、tar.Z、taz、tar.tgz、zip、rar、lha
热门文章
- CENTOS6.4安装vnc-server
- 通过system调用Am命令执行动作
- 一个古怪的VISTA网络问题解决的坎坷经历
- CCNA,CCNP资料
- Regulator的下载地址
- python如何安装panda数据库_在Pycharm中安装Pandas库方法(简单易懂)
- SparkSession.read().csv()无法定位本地文件的问题
- CentOSLinux安装Docker容器
- error记录 | 不能将参数 1 从“const char [5]”转换为“LPCTSTR
- STM32的FLASH ID加密