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!do address 显示某地址的对象的信息, 包括fields, EEClass, Method Table和object size
查找具体的位置 保存Model 到具体的地方 反编译查看原因
感谢分享,我会认真学习的! 谢谢分享 钻研中
C:\Users\Administrator\AppData\Local\Temp maskbank 发表于 2024-4-8 15:50
C:%users\Administrator\AppData\Local\Temp
谢谢分享 钻研中
谢谢分享 钻研中
页:
[1]