谁';It’s正在使用我的内存:很多虚拟分配,但都是小堆

本文关键字:虚拟 分配 内存 我的 It | 更新日期: 2023-09-27 18:20:54

我的WPF.net应用程序似乎会泄漏内存(我也使用本机和第三方组件)。我提取了一些内存转储,并使用DebugDiag、WinDBG和VMMap对其进行了分析。我已经看到托管堆以及本地堆和线程都相当稳定(在较低级别上)。然后我用DebugDiag做了一个分析。显示到目前为止,大部分是通过"虚拟分配"分配的(2.5GB:12.2GB已提交,1.2GB已保留)。

VMMap显示我的大部分内存要么是"私有数据",要么是在一个转储中,甚至是"页面表"。。。我怎么能弄清楚谁对此负责???(我本以为托管堆或本机堆会增长)

编辑(让我添加一些额外的计数器):

.NET CLR Memory | # Total committed Bytes        357945K  
.NET CLR Memory | # Total reserved Bytes         402554K  
.NET CLR Memory | Large Object Heap size          79182K  
Process | Private Bytes                         1299080K  
Process | Virtual Bytes                         2876524K

-------------------- Usage SUMMARY --------------------------
    TotSize (      KB)   Pct(Tots) Pct(Busy)   Usage
   92d50000 ( 2405696) : 57.36%    83.79%    : RegionUsageIsVAD
   50c11000 ( 1323076) : 31.55%    00.00%    : RegionUsageFree
   12c6c000 (  307632) : 07.33%    10.71%    : RegionUsageImage
    79fe000 (  124920) : 02.98%    04.35%    : RegionUsageStack
          0 (       0) : 00.00%    00.00%    : RegionUsageTeb
     540000 (    5376) : 00.13%    00.19%    : RegionUsageHeap
    1ae5000 (   27540) : 00.66%    00.96%    : RegionUsagePageHeap
          0 (       0) : 00.00%    00.00%    : RegionUsagePeb
          0 (       0) : 00.00%    00.00%    : RegionUsageProcessParametrs
          0 (       0) : 00.00%    00.00%    : RegionUsageEnvironmentBlock

谁';It’s正在使用我的内存:很多虚拟分配,但都是小堆

几点。。。

你的应用程序中既有本机代码,也有托管代码,所以试着找出哪一半是有问题的孩子。使用托管内存计数器和本机内存计数器运行perfmon以查看问题所在。如果托管内存计数器与本机内存计数都随时间增加,则可能存在泄漏。如果只是本机代码随着时间的推移而增加,那么本机代码就是罪魁祸首。

我总是使用这5个计数器:

  • .NET CLR内存|#提交的字节总数
  • .NET CLR内存|#保留字节总数
  • .NET CLR内存|大型对象堆大小
  • 进程|专用字节
  • 进程|虚拟字节

此外,还要注意大型对象堆的大小。您也可以在WinDbg中查看这些堆的内容。最后,虽然LOH上的对象会随着时间的推移而被收集到垃圾,但LOH从未被压缩,因此随着时间的流逝,LOH会受到碎片化的影响,如果你不小心在LOH中分配得太频繁,这会变得很明显。

编辑:我在VMMap上从来没有太多运气,相反,我主要使用perfmon和WinDbg,有时使用DebugDiag。

如果不看一下转储、应用程序或代码,很难进行推测,但您已经研究过这些:http://msdn.microsoft.com/en-us/magazine/cc163491.aspx