谁';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
几点。。。
你的应用程序中既有本机代码,也有托管代码,所以试着找出哪一半是有问题的孩子。使用托管内存计数器和本机内存计数器运行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