windbg托管内存泄漏排查

1、!address -summary  查看内存占用

        主要查看以下两项

        Heap:NT 堆 (同 !heap  -s),Size过大,可能有非托管内存泄露

        MEM_COMMIT:处于提交状态的内存大小,Size过大,可能有内存泄露

Heap              40        0`00d60000 (  13.375 MB)   0.20%    0.00%
MEM_COMMIT        742       0`8ea6e000 (   2.229 GB)  33.48%    0.00%

2、!eeheap -gc  查看托管堆占用

        托管堆已提交内存占用2Gb,和MEM_COMMIT大小大不多,可以确定是托管内存泄漏。

GC Committed Heap Size:    Size: 0x82a10000 (2191589376) bytes.

3、!dumpheap -stat 查看托管堆上对象分配情况

        String 类型的一般先不管,因为他一般都是被其他对象所持有的。这里主要看倒数第二项。

          MT      Count     TotalSize Class Name
7ffa04fe6618        571       136,952 System.Object[]
7ffa04feb1f0     16,215       389,160 System.Int32
7ffa056e66d0          2   134,217,776 Tedes.Model.Element[]
0000023d4f50 11,254,259   274,244,880 Free
7ffa056e60a8 13,100,201   524,008,040 Tedes.Model.Element
7ffa050a1e18 13,101,485 1,235,516,266 System.String

4、!dumpheap -mt 7ffa056e60a8  查看方法表对于的实例地址和占用内存大小。

        数据量太大这里会卡死一段时间,可以考虑出现一部分内容后截图,关掉windbg重开。

        随便找出一部分内容出来,放文档里

    Address               MT           Size0000aa9433d8     7ffa056e60a8             40 0000aa943478     7ffa056e60a8             40 0000aa943518     7ffa056e60a8             40 0000aa9435b8     7ffa056e60a8             40 0000aa943658     7ffa056e60a8             40 0000aa9436f8     7ffa056e60a8             40 0000aa943798     7ffa056e60a8             40 

5、!gcroot 0000aa9433d8   根据Address找到引用根

        随便找一个或多个Address来查看他的引用根,就知道是谁在溢出了

HandleTable:00000000023115f8 (pinned handle)--引用类型的静态变量会放在托管堆(小对象堆或大对象堆)中,被固定堆中的System.Object[]对象所持有-> 000012771038     System.Object[]             -> 00000290a180     System.Collections.Generic.List<Tedes.Model.Element> (static variable: Autofac.IContainer.container)            --真正泄露的集合-> 00006af01020     Tedes.Model.Element[] --对象实例数组,List内部就是数组-> 0000aa9433d8     Tedes.Model.Element   --对象实例

6、!dumpobj /d 00000290a180 查看一下这个对象实例

        看到_size 的大小有13100201个类实例。地址00000290a180就是找的溢出。可以在项目中查看哪里有定义Tedes.Model.Element[]的静态变量

        !objsize 00000290a180 可以查到占用了多少内存

0:000> !dumpobj /d 290a180
Name:        System.Collections.Generic.List`1[[Tedes.Model.Element, NFT.net]]
MethodTable: 00007ffa056e6138
EEClass:     00007ffa050ce048
Size:        32(0x20) bytes
File:        C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.25\System.Private.CoreLib.dll
Fields:MT    Field   Offset                 Type VT     Attr            Value Name
00007ffa05262ed8  4001c36        8     System.__Canon[]  0 instance 000000006af01020 _items
00007ffa04feb1f0  4001c37       10         System.Int32  1 instance         13100201 _size
00007ffa04feb1f0  4001c38       14         System.Int32  1 instance         13100201 _version
00007ffa05262ed8  4001c39        8     System.__Canon[]  0   static dynamic statics NYI                 s_emptyArray

7、如果还找不到哪里的问题(比如第三方dll有问题),可以找到具体的代码位置。

       7.1 找出谁引用了地址00000290a180,在System.Object[]的范围内搜索这个地址

                查看System.Object[]的大小: !do 000012771038

0:000> !do 000012771038     
Name:        System.Object[]
MethodTable: 00007ffa04fe6618
EEClass:     00007ffa04fe6580
Size:        8184(0x1ff8) bytes

                得出System.Object[]的地址范围为:000012771038 ~ 000012771038+0x1ff8

                查找命令为:s-q 000012771038 L?0x1ff8 00000290a180

                00000000`12772c58 就是想要的东西

0:000> s-q 000012771038 L?0x1ff8 00000290a180
00000000`12772c58  00000000`0290a180 00000000`028c75b8

        7.2 全内存搜索: s-b 0 L?0xffffffffffffffff 58 2c 77 12

                00000000`12772c58 需要将转为58 2c 77 12来搜索

                找到两个地址,如下:

0:000> s-b 0 L?0xffffffffffffffff 58 2c 77 12
00007ffa`05561811  58 2c 77 12 48 89 4d d8-48 8b 4d e0 e8 26 df ff  X,w.H.M.H.M..&..
00007ffa`0556193b  58 2c 77 12 48 8b 55 f8-e8 08 50 5f 5f 90 48 8d  X,w.H.U...P__.H.

        7.3 找到地址对应的方法:

!ip2md 00007ffa`05561811

在ButtonOkOnClick点击事件中有引用

0:000> !ip2md 00007ffa`05561811
MethodDesc:   00007ffa056b77c0
Method Name:          Tedes.View.AboutForm.ButtonOkOnClick(System.Object, System.EventArgs)
Class:                00007ffa0569f6b8
MethodTable:          00007ffa056b78b0
mdToken:              0000000006000005
Module:               00007ffa050bf7d0
IsJitted:             yes
Current CodeAddr:     00007ffa055617a0
Version History:ILCodeVersion:      0000000000000000ReJIT ID:           0IL Addr:            0000000000000000CodeAddr:           00007ffa055617a0  (MinOptJitted)NativeCodeVersion:  0000000000000000

!ip2md 00007ffa`0556193b 

在LayerService的静态构造函数中有引用,可能是静态变量的初始化操作。

0:000> !ip2md 00007ffa`0556193b
MethodDesc:   00007ffa051fad08
Method Name:          Tedes.Services.Layer.LayerService..cctor()
Class:                00007ffa05212070
MethodTable:          00007ffa051fad18
mdToken:              000000000600003A
Module:               00007ffa050bf7d0
IsJitted:             yes
Current CodeAddr:     00007ffa05561900
Version History:ILCodeVersion:      0000000000000000ReJIT ID:           0IL Addr:            0000000000000000CodeAddr:           00007ffa05561900  (MinOptJitted)NativeCodeVersion:  0000000000000000

        7.4 将对应模块dll导出:!savemodule 00007ffa050bf7d0 D:\ButtonOkOnClick.dll

                通过反编译工具查看就行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中非绿色能源合作走深走实

近日&#xff0c;第十六届非洲能源大会在南非立法首都开普敦举行&#xff0c;探讨实现非洲能源转型的可持续解决方案。近年来&#xff0c;中国与非洲国家不断加强绿色能源合作&#xff0c;促进双方优势资源互补&#xff0c;逐步探索合作共赢的绿色能源合作方案。 势头良好 近年…

【201】Java8读取JSON树形结构并插入到MySQL数据库表中

我写了一个 maven 项目的 Demo&#xff0c;用来演示 JAVA8 如何读取 JSON 文件树形结构&#xff0c;并将这种树形结构保存到 MySQL 中。 json文件 city.json {"name": "山东省","sub": [{"name": "青岛市","sub"…

什么是SYN攻击,有什么办法防御SYN攻击

自进入数字化互联网时代&#xff0c;网络技术给我们带来了许多服务&#xff0c;为人们的生活增添了许多便利。但同时&#xff0c;网络安全问题也日益凸显&#xff0c;其中DDoS攻击&#xff0c;即分布式拒绝服务攻击&#xff0c;已经成为一种常见的网络威胁。这种攻击方式通过控…

数据结构与算法实验10-查找和排序

、实验目的 掌握运用数据结构两种基本运算查找和排序,并能通过其能解决应用问题。 二、实验软硬件要求 1、VC 6.0 三、实验预习 查找排序相关算法 四、实验内容&#xff08;实验步骤、测试数据等&#xff09; 为宿舍管理人员编写一个宿舍管理查询软件, 程序采用交互工作…

Python爬取公众号封面图(零基础也能看懂)

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

c语言:大端小端(真实考试题目)

请简述大端字节序和小端字节序的概念&#xff0c;设计一个程序&#xff08;代码&#xff09;判断当前机器的字节序 大端&#xff08;存储&#xff09;字节序&#xff1a;是指数据的低位保存在内存的高地址中&#xff0c; 数据的高位保存在内存的低地址中。 小端&#xff08;存储…

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(十)- 向量整数算术指令

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…

文献速递:深度学习胰腺癌诊断--深度学习算法用于从疾病轨迹预测胰腺癌风险

文献速递&#xff1a;深度学习胰腺癌诊断--深度学习算法用于从疾病轨迹预测胰腺癌风险 麦田医学 美好事物中转站 2024-04-02 14:36 Title 题目 A deep learning algorithm to predict risk of pancreatic cancer from disease trajectories 深度学习算法用于从疾病轨迹预测…

Redis 客户端

Redis 客户端 客户端-服务器结构 Redis 同 Mysql 一样&#xff0c;也是一个客户端-服务器结构的程序&#xff0c;结构如下图&#xff1a; 注&#xff1a;Redis 客户端和服务器可以在同一个主机上&#xff0c;也可以在不同主机上 Redis 客户端的多种形态 自带的命令行客户端&…

HTML:表单

案例&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>报名表</title> </head> <body><form action"demo/welcome.php" method"post">名字&#xff1a;<inpu…

【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)

#算法 目录 题目描述思路及实现方式一&#xff1a;递归思路代码实现Java 版本C 语言版本Python3 版本 复杂度分析 方式二&#xff1a;迭代和原地反转思路代码实现Java 版本C 语言版本Python3 版本 复杂度分析 总结相似题目 标签&#xff1a;链表、递归 题目描述 给你链表的头…

金融企业区域集中库的设计构想和测试验证

导读 本文探讨了金融企业区域集中库的设计构想和测试验证&#xff0c;包括架构设想、数据库整合场景测试及优势和使用设想。作者提出利用 TiDB 数据库产品集中建设区域集中库&#xff0c;解决 MySQL 存量节点的整合问题&#xff0c;实现部署的标准化、按需扩展和统一运维管理。…

ArcGIS10.8保姆式安装教程

ArcGIS 10.8是一款非常强大的地理信息系统软件&#xff0c;用于创建、管理、分析和可视化地理数据。以下是ArcGIS 10.8的详细安装教程&#xff1a; 确保系统满足安装要求 在开始安装之前&#xff0c;请确保您的计算机满足以下系统要求&#xff1a; 操作系统&#xff1a;Windo…

【算法集训】基础算法:前缀和 | 习题篇

习题 1480. 一维数组的动态和 简单的前缀和 int* runningSum(int* nums, int numsSize, int* returnSize){int * ret (int *)malloc(sizeof(int) * numsSize);ret[0] nums[0];for(int i 1; i < numsSize; i) {ret[i] ret[i - 1] nums[i];}*returnSize numsSize;ret…

阿里云4核8G服务器ECS通用算力型u1实例优惠价格

阿里云4核8G服务器优惠价格955元一年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采用Intel(R) Xeon(R) Platinum处理器&#xff0c;阿里云活动链接 aliyunfuwuq…

逻辑回归详解

逻辑回归详解 逻辑回归&#xff0c;虽然名字中带有“回归”二字&#xff0c;但实际上它是一种分类算法&#xff0c;被广泛用于处理二分类问题。在机器学习和统计学习中&#xff0c;逻辑回归占据了重要的地位&#xff0c;是数据科学家和机器学习工程师的必备工具。本文将详细解…

11 flink-sql 中基于 mysql-cdc 连接 mysql-pxc 集群无法获取增量数据问题

前言 问题是来自于 群友, 2024.03.29, 也是花了一些时间 来排查这个问题 大致的问题是用 mysql-cdc 连接了一个 mysql-pxc 集群, 然后创建了一个 test_user 表 使用 "select * from test_user" 获取数据表的数据, 可以拿到 查询时的快照, 但是 无法获取到后续对…

拾光坞N3 ARM 虚拟主机 i茅台项目

拾光坞N3 在Dcoker部署i茅台案例 OS&#xff1a;Ubuntu 22.04.1 LTS aarch64 cpu&#xff1a;RK3566 ram&#xff1a;2G 部署流程——》mysql——》java8——》redis——》nginx mysql # 依赖 apt update apt install -y net-tools apt install -y libaio* # 下载mysql wg…

CSS设置字体样式

目录 前言&#xff1a; 1.font-family&#xff1a; 2.font-style&#xff1a; 3.font-weight&#xff1a; 4.font-size&#xff1a; 5.font-variant&#xff1a; 6.font&#xff1a; 前言&#xff1a; 在网页中字体是重要的组成部分&#xff0c;使用好字体可以让网页更…

[AIGC] Spring Interceptor 拦截器详解

文章目录 什么是Spring Interceptor如何使用Spring InterceptorSpring Interceptor的影响 什么是Spring Interceptor Interceptor&#xff08;拦截器&#xff09;是Spring MVC框架中的一种特性&#xff0c;类似于Servlet开发中的Filter&#xff08;过滤器&#xff09;&#xf…