Windbg 查内存占用
内存类型:
即Type值,共有四种:第一种是什么都不是,即尚未被使用的;
第二种是MEM_IMAGE,即地址映射于一个可执行镜像文件片段,如DLL文件;
第三种是MEM_ MAPPED,即地址映射于不可执行的镜像文件片段,如页文件;
第四种是MEM_PRIVATE,即私有有内存,这里的私有是针对进程而言的,私有内存无法在多个进程间共享;
保护模式:即Protect值,上例中见识了两种保护模式,
NOACCESS和READWRITE。从字面即很容易理解其意思,前者是不能做任何访问的,因为空闲内存是无效内存;后者则可读可写,但不能执行,说明是保存数据的地方。所有可用的保护包括:PAGE_NOACCESS(不可访问),PAGE_READONLY(只读),PAGE_READWRITE(读写),PAGE_EXECUTE(可执行), PAGE_EXECUTE_READ(执行并可读),PAGE_EXECUTE_READWRITE(执行并可读写),PAGE_WRITECOPY(写时拷贝),PAGE_EXECUTE_WRITECOPY(执行,并写时拷贝), PAGE_GUARD(保护)
内存用途:即Usage值,有这样一些值和用途。RegionUsageIsVAD:表示此地址区域已被分配;RegionUsageFree:代表此地址区域已被释放,既没有保留也没有被提交,将来可以申请使用;
- RegionUsageImage:代表此地址区域被映射到二进制文件的镜像;Region UsageStack:代表此地址区域用于线程栈;RegionUsageTeb:代表此地址区域用于保存目标进程的所有线程的TEB结构;
- RegionUsageHeap:代表此地址区域用于堆内存;RegionUsage Pdb:代表此地址区域用于保存目标进程的PEB结构;RegionUsageProcessParameters:代表此内存块用于保存目标进程的启动参数;
- RegionUsageEnviromentBlock:代表此地址区域用于保存目标进程的环境块
用户环境下可使用下面的命令显示内存统计信息,包括内存用途、内存类型、内存状态 !address -summary
- !vprot [地址]
- !vadump [-v]
命令!vprot显示指定内存块的信息,侧重于内存保护信息;命令!vadump显示整个内存空间信息,dump者倾泻也,开启-v选项将显示详细(Verbose)信息。
上面讲过,用户环境下使用“!address –summary”可显示用户空间的内存统计信息;现在再看两个内核命令,在内核环境下显示内存的统计信息:
- !memusage
此命令从物理内存角度显示内存统计信息。无数个页表信息将被打印出来,可以说是“最内存”的信息。此命令会查看所有的页帧,所以运行时会非常地耗时。
- !vm
此命令从虚拟内存的角度显示内存统计信息,不仅能从全局角度显示虚拟内存的使用情况,还能以进程为单位显示内存使用情况。
-----具体查询内存占用的方法 如下
!EEHeap [-gc] [-loader] 查找堆信息
!DumpHeap 将遍历 GC 堆对对象进行分析。通过指定不同的选项,可以查看特定的类型、数组和锁。
如果不加任何选项,该命令的输出首先为堆中对象的列表,然后是包含已发现类型的列表、大小和数量的报表。
其中 “Free” 对象代表的是垃圾回收器可以使用的区域。如果此区域的大小超过30%则可能意味着出现了堆碎片。
这通常是由于某些对象被持有了较长时间,并且结合了大量高频率的内存分配。
!DumpHeap 会针对此情况提供一个关于堆碎片化的警告
-stat 限定输出为类型统计分析的汇总
-min <size> 忽略尺寸小于给定的 bytes 值的对象
-max <size> 忽略尺寸大于给定的 bytes 值的对象
!dumpheap -min 850000 -stat 查找具体占用内存大的对象 -stat (是否统计输出)
有两个地址 查找该地址的引用 !gcroot 000000052f342dc8