vmmap 分析内存泄露问题
The following article is from 一个程序员的修炼之路 Author 河边一枝柳
vmmap介绍
Free: 图中显示
137434599232K
,是不是被吓到了。这个一般是指虚拟地址空间。每个进程都有自己的虚拟地址空间,比如32位的一般为4G,其中2G是内核地址空间, 2GB用户态地址空间;64位理论上为2^64
个字节,实际上没那么大,按照MSDN的描述64位的Windows用户态可使用地址空间为128TB
。Heap: 这个主要就是指我们通过C/C++的
malloc
,new
;以及HeapAlloc
等申请的内存大小Image: 比较好理解,一般指进程启动的运行文件,比如Exe或者加载的DLL文件。
Managed Heap: 这个一般指用C#编写代码使用的托管堆。比如一个程序可能是C#和C++均有实现,这个时候可以查看是不是托管堆占用的内存持续增高,那么就可以判断一般是C#部分托管堆使用有问题造成了泄露。
Mapped File: 主要是指内存映射文件,熟悉的同学应该知道,这也是常用的进程间通信的一种方式。
Private Data: 主要指通过
VirtualAlloc
申请的内存空间。这里也注意同Free
主要是指已经使用的地址空间,而非已经Commit
的内存。比如下图中,Stack: 函数栈所使用的内存大小
Shareable: 主要是进程间可以共享的内存,但是后备存储器为RAM或者Paging File(一般是指虚拟内存page.sys)。
Page Table: 主要指内核中和该进程页表相关联的内存
Committed: 对于一个虚拟地址空间的使用,我们可以是申请地址空间,但不提交(
commit
),如果不提交,则不会占用真实的存储器空间(比如RAM或者Paging File),只有commit
后才会使用物理内存(RAM或者Paging File)。那么VMMap这里所指的内存就是后备存储器为RAM, Paging File, 或者Mapped file。Working Set: 一般内存有RAM,还有虚拟内存(page.sys),而根据内存的调度原理,并不是所有的内存都常驻RAM。
Working Set
就是主要指在RAM中所使用的内存。
VMMap分析内存泄露
#include <iostream>
#include <chrono>
#include <thread>
#include <windows.h>
void HeapMemoryLeakSample() {
const int iListSize = 10;
char* pHeapList[iListSize];
//Alloc 10 Heap STR_SIZE
const int STR_SIZE = 10 * 1000 * 1000;
for (int i = 0; i < iListSize; i++) {
pHeapList[i] = new char [STR_SIZE];
strcpy_s(pHeapList[i], STR_SIZE, "Alloc Memory");
std::cout << pHeapList[i] << std::endl;
std::this_thread::sleep_for (std::chrono::seconds(10));
}
//Free 5 Heap space
for (int i = 0; i < iListSize; i++) {
if (i % 2 == 0) {
delete pHeapList[i];
std::cout << "Free Memory" << std::endl;
std::this_thread::sleep_for (std::chrono::seconds(10));
}
}
}
int main() {
HeapMemoryLeakSample();
while (true) {
std::this_thread::sleep_for (std::chrono::seconds(10));
}
return 0;
}
- EOF -
关注『CPP开发者』
看精选C++技术文章 . 加C++开发者专属圈子
点赞和在看就是最大的支持❤️