内存泄漏监控与分析工具
一、内存
内存主要作用是在计算机运行时为操作系统和各种程序提供临时储存。
1、物理内存
物理内存(Physical memory)即RAM,是相对于虚拟内存而言的。物理内存指通过物理内存条而获得的内存空间,常见的物理内存规格有256M、512M、1G、2G等,现如今随着计算机硬件的发展,已经出现4G、8G甚至更高容量的内存规格。
我们H3C云屏整机的物理内存就是16G的。
在任务管理器中和其他内存工具中,物理内存称为工作集/Working set。
2、虚拟内存
虚拟内存是为了满足系统对超出物理内存容量的需求时在外存(如硬盘)上开辟的存储空间,就是把硬盘中的一部分空间用来当做内存使用。
虚拟内存在硬盘上存在的是一个文件 PAGEFILE.SYS,可以自己通过操作系统设置虚拟内存的大小。
由于虚拟内存其实是放在外存上,因而与物理内存相比读写速度都非常慢。
从进程角度,给到每个进程的内存都称为虚拟内存,分为物理内存、保留内存和换页内存,这些内存中前者映射到物理内存上,后两者保留在磁盘上。
①保留内存(reserved memory)
将虚拟内存空间中线性地址0xXXXXXXXX-0xYYYYYYYY标记为预定状态,但是并没有分配实际的内存。这样的好处是我先预定一部分线性地址,以免后面进程空间中没有这么大的地址范围可用(一般来讲只有服务器上面这样用得多)。这样预定后,0xXXXXXXXX-0xYYYYYYYY这块地址就被占用,地址空间也是资源,虽然还没有分配任何内存。
②换页内存(Page File)
也属于已经提交的内存,不过因为不常用,可能被系统置换到磁盘上面以节省物理内存,后面如果要使用会发生换页错误(缺页中断),再从磁盘上面置换到物理内存。
3、private memory
给当前进程使用而保留的私有虚拟内存的数量,而Private Bytes实际上是虚拟内存的概念,是包含WorkingSet Private的,另外一部分是在换页文件(被从物理内存里面换出去了)里面,有些内存,虽然你提交,但是如果一直没有使用,也是在换页文件里面。
4、提交内存(committed memory)
物理内存和换页内存都属于已经提交的内存。
当进程运行时,会向系统提交需要使用的内存分配申请,但提交的这部分内存并不一定都使用。这部分提交申请的内存,当不再需要时就要归还。
可申请的最大内存容量限制为:物理内存+虚拟内存。
暂时无法在飞书文档外展示此内容
左边的数字指的是:电脑当前运行的所有程序总共已经向操作系统申请的内存空间
右边的数字指的是:电脑当前运行的所有程序总共可以向操作系统申请的内存空间
Committed = VM Private memory + VM Shareable memory(VM:虚拟内存)
Committed = Working Set + Page File
5、共享内存
Intel核显没有自己的独立显存,所以必须从物理内存中划分部分内存作为共享内存,和显卡共享这部分内存使用,显卡利用这部分内存进行显卡数据的缓存和处理。
我们H3C云屏整机的共享内存为8G.
二、什么是内存泄漏?
内存泄漏是指程序分配内存,然后在不再需要时不将其归还。泄漏的内存被浪费了,因为程序本身不再使用它,但在程序退出之前没有其他东西可以使用它。
如果你继续做一些触发泄漏的事情,那么内存使用通常会不断增加。(如果内存使用量只在你第一次做某事时增加,而且增加不是很大,那么它可能只是一个分配缓存的组件,它将重新使用它以加快未来的操作。这样的缓存通常在一个几分钟不活动,尽管这取决于组件。)
高内存使用率并不总是意味着存在内存泄漏。如果您正在做的事情本身就需要大量内存,并且在操作完成后该内存被返还,那么这不是内存泄漏。
三、内存监控方法及工具
|
任务管理器中名称
|
Process Explorer中名称
|
VMMap中的名称
|
|
工作集(内存)
|
Working Set
|
Total WS
|
|
内存(专用工作集)
|
WS Private
|
Private WS
|
|
提交大小
|
Private Bytes
|
Private(or Private Bytes)
|
|
内存(共享工作集)
|
WS Shareable
|
Shareable WS
|
|
none
|
WS Shared
|
Shared WS
|
|
none
|
Virtrual Size
|
Size
|
|
none
|
none
|
Committed
|
1、任务管理器
①资源管理器
通过任务管理器,可以打开资源监视器 Resource Manager进一步检查内存的使用情况,尤其是每个进程的使用情况。对于各个进程而言,请重点关注"提交(KB)"内存的大小,监控是否有进程消耗过多资源。
物理内存的使用包含以下几个部分: 为硬件保留的内存 正在使用:由进程、驱动程序、操作系统使用的内存 已修改:内容必须写入磁盘才能用于其它用途的内存 备用:包含未使用的缓存数据和代码的内存 可用:不包含任何有价值数据,以及当进程、驱动程序、操作系统需要更多的内存时优先使用的内存
缓存:当文件被打开时,系统会把文件保存在缓存中,才以便下次迅速读写。Windows 2008 R2及以后,对这个缓存的使用也做了限制:有一部分物理内存不会被缓存使用,保证系统即使在缓存过大的时候,也有可用物理内存,满足程序使用需求。
2、Process Explorer
下载链接:https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer
这是一款由Sysinternals开发的Windows系统和应用程序监视工具,目前Sysinternals已经被微软收购,此款不仅结合了文件监视和注册表监视两个工具的功能,还增加了多项重要的增强功能。有的人把它当作任务管理器的替代品,其实它比任务管理器好用得多。如暂停中的进程用灰色显示,服务用粉色显示等等。
其可选择替代系统默认的任务管理器:
也可以查看进程的详细资源占用情况,例如打开后也可以查看到进程的各类内存资源使用情况:
优点:
1.准确的显示的进程的父子关系
2.通过颜色可以判断此进程处于的状态和类型,是挂起还是正在退出,是服务进程还是普通进程。
在右键单击标题栏-选择Select Columns项,可选择你要观察进程的某种特定的信息,而要监控进程内存,我们可选择Process Memory,如图:
如果有怀疑的程序,可以先点击鼠标右键点击,在弹出的选项中选择【挂起】选项。
如果确定是这个程序造成的,可以点击鼠标右键,在弹出的选项中点击【属性】,打开属性窗口后,点击顶部选项栏的【映像】选项。
点击路径选项后的【浏览】按钮就可打开文件的安装位置,打开安装位置后,点击鼠标右键,在弹出的饿选项中点击【删除】,会提示您将文件夹放入到回收站中点击【是】即可。
3、vmmap
https://learn.microsoft.com/zh-cn/sysinternals/downloads/vmmap
VMMap 是进程虚拟和物理内存分析实用工具。 它显示了进程的已提交虚拟内存类型以及操作系统分配给这些类型的工作集。
监控某个进程是否存在内存泄漏,可重点看到Committed、Private Bytes、Working Set这三个内存状态,当进程运行时,内存可能会增加,当关掉内存或进程暂停操作时,可看到内存占用减小。如未减小,就可能存在内存泄漏情况。
Type一列的含义如下:
Image(可执行文件,这应是程序员所写代码编译后装入内存的部分),
Mapped file(由CreateFileMapping以文件作为back up)。
Sharable(由CreateFileMapping以内存作为 back up)
Private Data(由Virtual Alloc分配,可能是程序的私有变量)
Heap(由new,GlobalAlloc和HeapAlloc等分配)
Stack(栈占用的控件)
Page table(内核里面维护当前虚拟地址控件所需要的内存,每个应用程序的内存都包含这个)
Managed Heap(由.NET garbage collector分配和管理,.Net写的程序才有这个);
Mapped file,Sharable,都是用CreateFileMapping创建;
CreateFileMapping的基本用法是创建内存映射文件,就是申请一片内存,申请成功后该片内存可以像访问文件一样访问;
纵向的,又包括:
Size: 总体大小,包括了commit和没有reservce的内存;
Committed: committed的大小,包括Private内存和可共享的内存;
Private:属于当前进程的虚拟内存,指的是当你修改他时仅仅当前进程会受到影响;
以下的几个指标指的是物理内存:
Total WS: 所有的working set,包括private working set和sharable working set;
Private WS: private working set,仅属于当前进程的working set;
Sharable WS,可共享的working set;
Shared WS,已经共享的working set,这个值应该是sharable working set的一部分或者全部;
4、RAMMAP
RAMMAP高级物理内存使用情况分析实用工具。它可显示系统如何分配物理内存、在 RAM 中缓存多少文件数据,还是内核和设备驱动程序使用多少 RAM ,它在多个不同的选项卡上以不同的方式显示使用情况信息:
- Active: 正在使用中的实体内存分页(Process Working Set或System Working Set)
- Standby: 留在实体内存但暂不使用的分页,保留供后续能快速重覆利用。(已经被使用,但非活动的内存页,它们会一直保留在物理内存,如果某些进程需要的内存在备用内存中,将被重用,所以实际上为进程的缓存)
- Modified: 与Standy类似,但内容被修改过,重覆使用前要先回写到硬盘机
- Modified no write: 与Modified类似,但标注为不需回写到硬盘
- Transition: 在分类之间转换的分页
- Zeroed: 内容已清空可供使用的分页,系统刚开机时明显增加,随著使用一段时间逐步转为Standby
- Free: 可以使用但残留先前资料的分页,使用前需先转为Zeroed
- Bad: 标注损坏的内存**加粗样式**
用rammap释放备用内存可能影响业务,如果可用内存足够,不建议操作。
5、GPUVIEW
想要使用GPUVIEW,需先把系统语言改为英语:
然后到微软官方下载合适版本的ADK
https://learn.microsoft.com/zh-cn/windows-hardware/get-started/adk-install
安装完成后,可在
以管理员身份运行cmd,cd到1.第一次使用时,输入log.cmd,生成环境变量 2.再次输入log.cmd,启动时间跟踪,抓取GPU的log; 3.再次运行Log.cmd,停止跟踪。停止运行会生成一个GPU可以读取的Merged.etl 文件。
①GPU Hardware Queue(硬件队列)
GPU 硬件队列表示硬件上的工作流,如3D渲染和视频硬解码。
点开随便一点,可看到其对应的进程及信息:
在这些工作流队列中,放大后(按a或s)可看到矩形堆栈,底部的项表示当前正在执行的工作。 上面堆积的矩形表示正在等待的工作。
在上图中,红色省略号内的 DMA 数据包表示硬件正在执行的工作,黑色椭圆中的 DMA 数据包表示视频计划程序放置在硬件上的第二个数据包。 它们是正在等待的数据包。
矩形的末尾并不意味着对象的功能生存期结束。 在这里,在红色省略号内,当硬件完成当前数据包 (项底部) 时,等待的 DMA 数据包现在转换为硬件正在处理的 DMA 数据包。 在此转换点,等待的最顶层 DMA 数据包 (向下) 一步,使其更接近硬件上运行。
②Filp Queue(翻转队列)
翻转队列,在N卡控制面板里叫最大预渲染帧数。就是在显卡里面,CPU预渲染多少帧,渲染完了不画出来,多存几帧,提高帧率稳定性。显示监视器的垂直同步 (VSync) 与应用程序中的当前数据之间的关系。 UI 中翻转队列的位置与 GPU 硬件队列直接相关。
翻转队列需要注意的是,它分为纯色部分和交叉分区。 纯色部分表示应用程序在此示例中 (时,DWM) 正在努力生成需要显示的内容的时间。 交叉分区表示数据在 VSync) (等待翻转时刻的空闲时间。
进程区域:该模块对应的是抓取log时在运行的各进程。
③idle(空闲进程)
第一个绿色区域是直接与 CPU 空闲时间相关的进程工作流。 当 GPUView 分析事件文件时,它会确定有多少处理器,并确定这些进程何时处于空闲状态。 因此,空闲进程会显示在相应 CPU 上未完成工作时。
④system(所有剩余进程)
其余所有绿色进程区域显示具有关联线程和视频上下文队列的进程,进程区域中显示的项目表示在该进程中在其线程上执行的工作。
浙公网安备 33010602011771号