0

为什么.NET 内存管理会创建这么大的对象堆?大部分似乎是空的。这有什么需要担心的吗?

以下数据是否意味着实际上我的应用程序中只有 179 MB 的大型对象?通过从 1171428792 (Heap0 LOH) 中减去 983396616 (free LOH) 得到 179 MB。

以下信息是通过在 w3wp.exe 即 ASP.NET 进程上创建的转储文件上使用 WinDbg 收集的。该进程托管在 Windows 2008 64 位操作系统上。该应用程序是使用 Microsoft .NET Framework 4.0 和 ASP.NET MVC 3 构建的。

0:025> !HeapStat
Heap             Gen0         Gen1         Gen2          LOH
Heap0         4628496      3840808    319586376   1171428792

Free space:                                                 Percentage
Heap0              24           24      1926224    983396616SOH:  0% LOH: 83%
4

2 回答 2

0

我建议运行 !DumpHeap -stat 查找名为“FREE”的对象的总字节值。这些将是 LOH 中的空闲块可供使用,但已被大型对象堆碎片化。如果这个数字很接近,那么你的 LOH 会遇到很多短暂的对象,并留下空闲内存碎片(请记住,这个堆永远不会压缩自己)。

于 2011-07-28T14:53:26.073 回答
0

您确定大部分 LOH 已提交 - 还是只是保留的地址空间?

我刚刚使用 Sysinternal 的 VM Map 在这里查看了一个 PowerShell.exe 实例。这显示了大约 390MB 的总 GC 堆,但保留了两个最大的块(大约 240MB 和大约 125MB)。小于 20MB 被提交(即分配的物理内存或页面文件空间)。

为了加强这一点,总进程提交约为 200MB,小于分配给 GC 堆的地址空间。

于 2011-07-28T15:14:33.967 回答