【问题标题】:What is the exact difference between MEM_RESERVE and MEM_COMMIT states?MEM_RESERVE 和 MEM_COMMIT 状态之间的确切区别是什么?
【发布时间】:2010-03-30 15:07:56
【问题描述】:

据我了解,MEM_RESERVE 实际上是“空闲”内存,即可供我的进程使用,但尚未分配?或者它以前被分配,但后来被释放了?

具体来说,在下面的 !address 输出中查看我几乎没有虚拟地址空间(99900 KB 可用,2307872 为 MEM_PRIVATE。但状态显示其中 44.75% 实际上是 MEM_RESERVE。这是否意味着它实际上是免费的,在我的过程中......但可能是零散的?

0:000> !address -summary
 --------- PEB a8bd8000 not found ----

-------------------- Usage SUMMARY --------------------------
    TotSize (      KB)   Pct(Tots) Pct(Busy)   Usage
   259af000 (  616124) : 22.29%    23.12%    : RegionUsageIsVAD
    618f000 (   99900) : 03.61%    00.00%    : RegionUsageFree
   13e22000 (  325768) : 11.78%    12.22%    : RegionUsageImage
   42c04000 ( 1093648) : 39.56%    41.04%    : RegionUsageStack
     42d000 (    4276) : 00.15%    00.16%    : RegionUsageTeb
   2625d000 (  625012) : 22.61%    23.45%    : RegionUsageHeap
          0 (       0) : 00.00%    00.00%    : RegionUsagePageHeap
          0 (       0) : 00.00%    00.00%    : RegionUsagePeb
       1000 (       4) : 00.00%    00.00%    : RegionUsageProcessParametrs
       1000 (       4) : 00.00%    00.00%    : RegionUsageEnvironmentBlock
       Tot: a8bf0000 (2764736 KB) Busy: a2a61000 (2664836 KB)

-------------------- Type SUMMARY --------------------------
    TotSize (      KB)   Pct(Tots)  Usage
    618f000 (   99900) : 03.61%   : <free>
   13e22000 (  325768) : 11.78%   : MEM_IMAGE
    1e77000 (   31196) : 01.13%   : MEM_MAPPED
   8cdc8000 ( 2307872) : 83.48%   : MEM_PRIVATE

-------------------- State SUMMARY --------------------------
    TotSize (      KB)   Pct(Tots)  Usage
   57235000 ( 1427668) : 51.64%   : MEM_COMMIT
    618f000 (   99900) : 03.61%   : MEM_FREE
   4b82c000 ( 1237168) : 44.75%   : MEM_RESERVE

Largest free region: Base 7e4a1000 - Size 000ff000 (1020 KB)

跟进:

因此,就我的示例而言,此过程报告“内存不足”,但实际上它可以进行分配,但有人 MEM_RESERVED 超出了他们当时的需要,从而阻止其他人甚至无法分配?

【问题讨论】:

    标签: memory winapi memory-management windbg


    【解决方案1】:

    MEM_RESERVE 由进程分配。 IE。地址空间被认为正在使用中。然而,它并没有被承诺。要实际使用内存进行存储,它必须被提交。 Mark Russinovich 有an excellent post,它描述了所有细节。来自帖子

    Testlimit 的 -r 开关有保留 虚拟内存,但实际上不是 提交它。保留的虚拟内存 实际上不能存储数据或代码,但是 应用程序有时使用 预留创建大块 虚拟内存,然后将其提交为 需要确保承诺的 内存在地址中是连续的 空间。当一个进程提交一个区域时 虚拟内存,操作 系统保证它可以保持 进程存储在 内存在物理内存或 磁盘。这意味着一个进程可以 遇到另一个限制: 提交限制。

    【讨论】:

    • 因此,就我的示例而言,此过程报告“内存不足”,但实际上它可以进行分配,但有人 MEM_RESERVED 超出了他们当时的需要,甚至阻止了其他人能够分配?
    • MEM_RESERVED 是每个进程的,因此进程保留该内存而不是其他人(如在另一个进程中)。
    • 当然,但重点是,这个进程报告分配失败,所以问题是某人(这个进程中的某个子系统)MEM_RESERVED 更多内存,它阻止了其他一些子系统分配?
    • 抱歉,我被“某人”部分弄糊涂了。无论如何,这很难说。作为代码保留内存的一部分,我假设它最终需要该内存来做某事。没有更多细节,很难确定问题的根源。
    • 线程保留堆栈空间,但仅在需要时提交(除非您在 .NET 上,在这种情况下它们会预先提交)。摆脱 1000 个线程中的一些可能是个好主意 :)
    猜你喜欢
    • 2014-11-19
    • 2016-01-19
    • 2013-03-25
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多