MEM_RESERVE和MEM_COMMIT状态之间的确切区别是什么?

时间:2010-03-30 15:07:57

标签: memory winapi memory-management windbg

据我了解,MEM_RESERVE实际上是“免费”内存,即可供我的进程使用,但尚未分配?或者之前已分配,但此后已被释放?

具体来说,请参阅我的!地址输出下面的我几乎没有虚拟地址空间(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比他们需要的更多,阻止其他人甚至能够分配?

1 个答案:

答案 0 :(得分:9)

MEM_RESERVE由进程分配。即地址空间被认为正在使用中。但是,它尚未兑现。要实际使用内存进行存储,必须提交它。 Mark Russinovich有an excellent post,描述了所有细节。来自帖子

  

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