Windows进程如何检测自身即将触及内存使用上限?
Windows作业对象进程内存限制检测方案
指标正确性判断
你首先想到的用Process.VirtualMemorySize64作为检测指标是完全正确的,原因是JOBOBJECT_EXTENDED_LIMIT_INFORMATION.ProcessMemoryLimit限制的是进程可提交的虚拟内存上限,和Process.VirtualMemorySize64统计的「关联进程已分配的虚拟内存总字节数」定义完全匹配。
其他内存指标的适用说明
你提到的其余指标均不匹配该作业对象限制的统计范围,各自用途如下:
WorkingSet64:统计进程当前实际驻留物理内存的大小,不含被交换到页文件的内存,和虚拟内存提交限制无关PrivateMemorySize64:统计进程独占、不可与其他进程共享的私有内存大小,未包含共享内存的提交量,统计范围小于作业对象限制的总提交虚拟内存PagedMemorySize64:统计进程已提交的可分页内存大小,不含不可分页的提交内存部分,统计范围不完整PagedSystemMemorySize64、NonPagedSystemMemorySize64:这两个统计的是内核态为进程分配的分页/非分页系统内存池大小,属于系统层面的额外开销,不纳入用户态进程的虚拟内存提交统计范围
接近上限检测逻辑
你可以按以下步骤实现检测:
- 首先获取当前进程所属作业对象配置的
ProcessMemoryLimit阈值,若进程未被作业对象限制,该值为0 - 定期读取当前进程的
Process.VirtualMemorySize64数值 - 计算已用占比,建议当已用值达到阈值的80%~90%时就触发接近上限告警,预留足够的缓冲空间
注意:如果作业对象开启了进程内存硬限制标记,进程虚拟内存提交量触达上限时会被系统直接终止,需要确保告警阈值预留足够的操作空间,避免来不及执行资源清理逻辑就被强制结束。
内容的提问来源于stack exchange,提问作者Oliver Bock
相关产品推荐
相关产品推荐

