PerfView專題 (第二篇):如何尋找 C# 中的 Heap堆內存泄漏

一:背景

上一篇我們聊到了如何去找 熱點函數,這一篇我們來看下當你的程序出現了 非托管內存泄漏 時如何去尋找可疑的代碼源頭,其實思路很簡單,就是在 HeapAlloc 或者 VirtualAlloc 時做 Hook 攔截,記錄它的調用棧以及分配的內存量, PerfView 會將這個 分配量 做成一個 權重,最后可以根據 權重 高低來找到有問題的調用棧。

二:案例演示

為了方便講述,我們演示一個 Windows 的 Nt堆 內存泄漏,讓 C# 調用 C++ 代碼時故意泄漏內存,代碼如下:

#include?<iostream>extern?"C"
{_declspec(dllexport)?int?calc_size(int?size);
}int?calc_size(int?size)?{int*?buffer?=?new?int[size];return?2?*?size;
}

然后在 C# 中導入這個 C++ 的 dll。

internal?class?Program{[DllImport("ConsoleApplication2.dll",?CallingConvention?=?CallingConvention.Cdecl)]extern?static?int?calc_size(int?size);static?void?Main(string[]?args){for?(int?i?=?0;?i?<?int.MaxValue;?i++){var?size?=?calc_size(1000);Console.WriteLine($"i={i}");}}}

接下來把程序跑起來,再打開 Perfview,在 OS Heap Process 輸入框填入進程號19404,監控 15s然后 Start Collection即可,這么做的目的時攔截 HeapAllocHeapFree 方法,截圖如下:

061b6b702dd8209b13cc73fd5b882b1c.png

稍等 15s 之后,打開 Memory / Net OS Heap Alloc Stacks 選項卡。

c35d9e33d4f2ee633eb8140ff2c791fa.png

接下來切到 CallTree 選項卡,清除掉 GroupPats 中的條件,觀察各自的調用棧,截圖如下:

1185544245278853db4ff402c1bc6d6e.png

從圖中的 inc % 列可以看到,calc_size 方法的 分配權重量 占 總分配量的 99.9% ,這就說明此方法有很大的嫌疑,最后就是查看源碼了哦。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/283770.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283770.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283770.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于 extern C的說明

在用C的項目源碼中&#xff0c;經常會不可避免的會看到下面的代碼 1 #ifdef __cplusplus 2 extern "C" { 3 #endif 4 5 /*...*/ 6 7 #ifdef __cplusplus 8 } 9 #endif 它到底有什么用呢&#xff0c;你知道嗎&#xff1f;而且這樣的問題經常會出現在面試or筆試…

Nginx 面試 40 問

Nginx是一款輕量級的Web服務器、反向代理服務器&#xff0c;由于它的內存占用少&#xff0c;啟動極快&#xff0c;高并發能力強&#xff0c;在互聯網項目中廣泛應用。 那么關于 Nginx 的核心技術點有哪些呢&#xff1f; 什么是Nginx&#xff1f; Nginx是一個 輕量級/高性能的…

用Cocos2dx開發棋牌游戲的觀點解析

眾所周知&#xff0c;目前棋牌游戲特別的火。很多游戲公司都想在這一塊賺錢&#xff0c;可是卻不知用什么軟件比較好的去開發棋牌游戲&#xff0c;對此&#xff0c;我列出了兩款比較靠譜的軟件去開發棋牌游戲&#xff0c;希望對大家有幫助&#xff01; 第一款軟件是cocos2dx,它…

JavaWEB中讀取配置信息

第一種方法是使用java.io和java.util包&#xff0c;缺點是路徑的概念要清晰&#xff0c;例子&#xff1a; Properties prop new Properties();InputStream in getClass().getResourceAsStream("/common.properties");try {prop.load(in);pool new JedisPool(config…

我把《系統設計》系列整理成了 PDF

大家好&#xff0c;我是等天黑。相信很多朋友應該注意到了&#xff0c;我最近發了很多系統設計的文章。是的&#xff0c;到目前為止&#xff0c;已經發了有 7 篇文章。這些內容主要翻譯自 Alex Xu 的 《System Design Interview》&#xff0c;有卷一和卷二兩本。System Design …

高性能IO模型淺析

服務器端編程經常需要構造高性能的IO模型&#xff0c;常見的IO模型有四種&#xff1a; &#xff08;1&#xff09;同步阻塞IO&#xff08;Blocking IO&#xff09;&#xff1a;即傳統的IO模型。 &#xff08;2&#xff09;同步非阻塞IO&#xff08;Non-blocking IO&#xff09;…

Java線程通信的幾種方式

一、問題 有兩個線程&#xff0c;A 線程向一個集合里面依次添加元素“abc”字符串&#xff0c;一共添加十次&#xff0c;當添加到第五次的時候&#xff0c;希望 B 線程能夠收到 A 線程的通知&#xff0c;然后 B 線程執行相關的業務操作。線程間通信的模型有兩種&#xff1a;共享…

PHP個人博客項目------切切歆語博客

2019獨角獸企業重金招聘Python工程師標準>>> phpmysqlapache, ThinkPHP3.2框架開發 我的個人博客項目 適合新手練習 源碼地址下載&#xff1a;https://github.com/DickyQie/php-myblog 轉載于:https://my.oschina.net/zhangqie/blog/1785867

收發郵件之 MAILKIT

背景利用代碼發送郵件在工作中還是比較常見的&#xff0c;相信大家都用過SmtpClient來處理發送郵件的操作&#xff0c;不過這個類以及被標記已過時&#xff0c;所以介紹一個微軟推薦的庫MailKit來處理。MailKit開源地址&#xff1a;https://github.com/jstedfast/MailKit需要郵…

IOS_SearchBar搜索欄及關鍵字高亮

搜索框的效果演示: 這個就是所謂的搜索框了,那么接下來我們看看如何使用代碼來實現這個功能. 我所使用的數據是英雄聯盟的英雄名單,是一個JSON數據的txt文件, JSON數據的處理代碼如下所示: ?123456//獲取文件的路徑pathNSString *path [[NSBundle mainBundle] pathForResourc…

Java設計模式之(工廠模式)--簡單工廠模式--工廠方法模式--抽象工廠模式

工廠模式&#xff1a; 工廠模式可以分為三類&#xff1a; 1&#xff09;簡單工廠模式&#xff08;Simple Factory&#xff09; 2&#xff09;工廠方法模式&#xff08;Factory Method&#xff09; 3&#xff09;抽象工廠模式&#xff08;Abstract Factory&#xff09; 簡單工…

今天很多 CTO 都是被干掉的,因為他沒有成就業務

作者&#xff5c;喬新亮 編輯&#xff5c;鄧艷琴 我可以絲毫不開玩笑地說&#xff0c;今天&#xff0c;很多傳統企業里的研發都只是“工人”&#xff0c;哪怕是 CTO&#xff0c;充其量也只是“高級工人”&#xff0c;如果不轉換思維去成就業務&#xff0c;就只能停留在工人級…

中航工業集團金網絡(北京)電子商務有限公司副總經理劉正珩:航空“智”造的供應鏈支撐平臺...

編者按 “十三五”時期是我國貿易發展的重要戰略機遇期&#xff0c;物流產業發展迅速&#xff0c;智慧供應鏈已經成為推動流通大國向流通強國過程中的重要行動。6月2日&#xff0c;由上海市國有資產監督管理委員會、上海市郵政管理局、上海市商務委員會指導&#xff0c;上海市國…

創建、檢查和反編譯世界上(幾乎)最短的 C# 程序

創建、檢查和反編譯世界上&#xff08;幾乎&#xff09;最短的 C# 程序原文來自https://www.stevejgordon.co.uk/creating-inspecting-decompiling-the-worlds-smallest-csharp-program在這篇文章中&#xff0c;我認為創建世界上&#xff08;幾乎&#xff09;最短的 C# 程序然后…

Linux下畫原理圖和PCB

Linux下畫原理圖和PCBWindows下大名鼎鼎的Allegro和經典的Protel 99SE都是不支持Linux操作系統的。做Linux驅動開發免不了要看一下原理圖和PCB。一般的做法有三種&#xff1a; 1.主機使用Windows系統&#xff0c;將Linux裝在VMWARE之類的虛擬機中這樣能夠使用Windows下的軟件看…

配置中心 App Configuration (二):Feature Flag 功能開關特性

寫在前面Web服務開發過程中我們經常有這樣的需求&#xff1a;某些功能我必須我修改了配置才啟用&#xff0c;比如新用戶注冊送券等&#xff1b;某個功能需到特定的時間才啟用&#xff0c;過后就失效&#xff0c;比如春節活動等&#xff1b;某些功能&#xff0c;我想先對10%的用…

oracle臨時表空間

--查看臨時表空間SELECT * FROM v$tablespace;SELECT * FROM dba_tablespaces;--查看所有臨時表空間文件SELECT * FROM dba_data_files;--查看臨時臨時表空間文件SELECT * FROM dba_temp_files;--查看臨時表空間組SELECT * FROM dba_tablespace_groups; --查找默認臨時表空間SE…

ES 2022 正式發布!有哪些新特性?

2022 年 6 月 22 日&#xff0c;第 123 屆 Ecma 大會批準了 ECMAScript 2022 語言規范[1]&#xff0c;這意味著它現在正式成為標準。 1 ECMAScript 2022編輯 本次發布的編輯有&#xff1a; Shu-yu Guo[2] Michael Ficarra[3] Kevin Gibbons[4] 2 ECMAScript 2022有什么新內…

聯想(Lenovo)小新310經典版進bios方法

1&#xff0c;找到novo按鈕。 2&#xff0c;在關機的狀態下桶一下小孔&#xff0c;不用任何操作&#xff0c;電腦進入bios選擇界面。轉載于:https://www.cnblogs.com/senior-engineer/p/6761457.html

C#中的匿名類型

這節來講一下C#中的匿名類型。匿名類在C#中&#xff0c;我們可以不去顯示的聲明一個類&#xff0c;而是通過匿名類去臨時聲明一個類結構去幫助我們去完成一些功能。聲明一個匿名類&#xff0c;我們可以像下面這樣做&#xff1a;var Anonymousnew {name"charles",year…