date | author | title | url | tags | categories | toc | draft | |||
---|---|---|---|---|---|---|---|---|---|---|
2022-06-28 16:49:30 +0800 |
Rustle Karl |
任务管理器中的内存 |
posts/windows/docs/questions/memory |
|
|
true |
false |
任务管理器中的“已提交”(Committed)中这两个数字,前面的是操作系统已经接受的应用提交的申请内存容量,后面的是可以接受应用申请的内存容量限制。
当进程向操作系统请求使用一段内存的时候,就 Windows 来说,根据调用的参数不同,会有两种处理方式:
-
MEM_RESERVE,请求并保留。Windows 会在虚拟内存中按照请求的内存地址和数量分配页面,并保证这部分虚拟内存在将来可用,不会被其它操作占用。但对物理内存、交换文件都没有任何影响。
-
MEM_COMMIT,请求并提交。Windows 会根据请求的内存数量相应增大已提交内存数量,保证将来进程使用这部分内存的时候有足够的内存资源分配给进程。但直到进程真正访问对应的内存时,操作系统才会在物理内存中给应用程序分配内存页面并且初始化。此外,请求的虚拟内存起始地址以及数量所描述的内存段必须先通过 MEM_RESERVE 方式的 VirtualAlloc 调用所保留,否则会报错。
任务管理器中“已提交”的两个数字,前面的数字,就是所有进程请求并提交的内存数量总和。这个值不能超过可提交内存上限,也就是后面的数字。可提交内存上限是物理内存容量+交换文件大小-内核保留内存。
如果进程试图向未提交的虚拟内存地址写入数据,会引发异常。如果进程申请提交的内存数量加上已提交的内存数量超过了可提交内存上限,则会引发虚拟内存不足异常。
这个问题曾经困扰了我很久,让我 64 GB 内存用出了 32 GB 内存的憋屈。
这里,我之前不知道什么意思,就一直选后台服务,造成了内存严重浪费。
Get-mmagent
Disable-MMAgent -mc
Enable-MMAgent -mc