Windbg 查内存占用

Posted Soft Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 到具体的地方 反编译查看原因

 

以上是关于Windbg 查内存占用的主要内容,如果未能解决你的问题,请参考以下文章

Windbg分析高内存占用问题

怎么查看进程在内存中的地址?

cgroup 内存泄露问题排查记录

linux下,一个运行中的程序,究竟占用了多少内存

linux系统怎么查看内存和CPU占用情况呀?

javajava 一个线程占用多少内存