首页 > 解决方案 > 第 0 代堆中的大间隙

问题描述

我目前正在调查内存泄漏,我无法真正解释,现在我正在寻找有用的链接或想法。

这是应用程序本机内存的屏幕截图(使用 .NET 内存分析器制作):

在此处输入图像描述

该应用程序大约需要 2.2 GB(这是正常的)。当应用程序有大约 3.5 GB 时进行转储。而#0 代中的这些差距是我目前无法解释的。对我来说,这似乎是因为垃圾收集器没有缩小第 0 代的差距。

为了有一个明确的问题:

我在这个网站上搜索过类似的问题,但其中大部分都是关于 LOH 的(在我的情况下似乎很好)。唯一存在某种类似大差距的问题是:什么是 GC Holes,但我看不出 2 KB 的第 0 代固定实例如何产生 1 GB 的孔。另一个问题是关于触发 GC 的阈值 GC 阈值。但我不敢相信没有一个单一的压实阶段。

标签: c#.netmemory-leaksgarbage-collectionmemory-profiling

解决方案


空洞/间隙表示两个分配的实例之间未使用的内存。当堆未完全压缩时(由于固定实例或垃圾收集器中的优化),会出现“空洞”。

您不能显式压缩堆本身。但是,GC 有时能够执行完整或部分收集。

所以你有差距,这是什么意思?这意味着分配给堆变得更加复杂,你能做些什么......不是很多。如果它是一个性能问题,你可以玩一下 GC。但是,如果您使用大量固定内存,则无能为力。这称为碎片

其他资源

垃圾收集器基础知识和性能提示

什么是 GC 孔?

固定对象时的 GC 行为

是什么导致 .NET 中的内存碎片

.NET 大对象堆上不再有内存碎片


推荐阅读