【问题标题】:.NET Committed vs. Reserved Heap Size.NET 提交与保留堆大小
【发布时间】:2009-06-14 06:17:56
【问题描述】:

我的程序有 7,667,712 个字节的已提交堆,但它有 33,546,240 个保留的堆字节!我可以看到该程序使用了大约 44 MB 的私有字节。如何让 .NET GC 为托管堆保留更少的空间?

【问题讨论】:

    标签: .net garbage-collection memory-management


    【解决方案1】:

    仅仅因为您的进程保留了内存,并不意味着它正在使用该内存。

    在 Windows 中,保留内存意味着您的进程已将页面映射到 它的地址空间。通过提交这些保留页来分配物理内存。当然,即便如此,您也不一定要使用该内存,因为已提交的页面可以换出到页面文件,从而暂时释放底层物理内存。

    简而言之,这不是您(通常)需要担心的事情。您要解决的问题是什么?

    【讨论】:

    • 我知道承诺和保留是什么意思。问题是用户经常抱怨 .NET 应用程序的高内存使用率,我想以某种方式隐藏这一点。
    • 用户应该关心物理内存的使用(committed),而不是保留,当你有高内存压力,或者当你运行虚拟地址空间时,你通常开始关心保留内存。该进程可以只保留 1 GB 的内存,对性能的影响为零。
    【解决方案2】:

    最简单的答案是你不能。 .Net GC 是自调的,它会热切地保留内存,但是直到需要它才提交内存,当不再需要内存时,它会再次更改为保留。

    当机器内存压力大时,GCuncommit内存。

    33 MB 并不是那么大,因为默认情况下(如果您的进程是 32 位并且您正在运行工作站 GC 模式),您将有一个为小对象堆保留的默认段,即 16 MB。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 2013-01-16
      • 2012-01-15
      • 2015-04-25
      • 2011-05-03
      • 2019-08-11
      • 2014-04-06
      相关资源
      最近更新 更多