c# - 第 0 代堆中的大间隙
问题描述
我目前正在调查内存泄漏,我无法真正解释,现在我正在寻找有用的链接或想法。
这是应用程序本机内存的屏幕截图(使用 .NET 内存分析器制作):
该应用程序大约需要 2.2 GB(这是正常的)。当应用程序有大约 3.5 GB 时进行转储。而#0 代中的这些差距是我目前无法解释的。对我来说,这似乎是因为垃圾收集器没有缩小第 0 代的差距。
为了有一个明确的问题:
- 这些差距是如何发生的?对我来说,这似乎是因为 GC 收集了死对象但没有压缩堆。我知道我无法触发或强制 GC 压缩堆。
我在这个网站上搜索过类似的问题,但其中大部分都是关于 LOH 的(在我的情况下似乎很好)。唯一存在某种类似大差距的问题是:什么是 GC Holes,但我看不出 2 KB 的第 0 代固定实例如何产生 1 GB 的孔。另一个问题是关于触发 GC 的阈值 GC 阈值。但我不敢相信没有一个单一的压实阶段。
解决方案
空洞/间隙表示两个分配的实例之间未使用的内存。当堆未完全压缩时(由于固定实例或垃圾收集器中的优化),会出现“空洞”。
您不能显式压缩堆本身。但是,GC 有时能够执行完整或部分收集。
所以你有差距,这是什么意思?这意味着分配给堆变得更加复杂,你能做些什么......不是很多。如果它是一个性能问题,你可以玩一下 GC。但是,如果您使用大量固定内存,则无能为力。这称为碎片
其他资源
推荐阅读
- google-play - 我的应用程序从 Play 商店中消失了......即使它仍然在开发者控制台中发布
- facebook - 如何撤销特定的 Facebook 访问令牌
- asp.net-mvc - 无法在 Angular 6 组件 templateurl 下加载 MVC 部分视图
- python - 更新未在 pygame 中注册的矩形坐标?
- php - 如何从图像元数据 php 中获取标签?
- android - 通过 Google 街景获取沿途图像?
- java - 是否可以清除java控制台?
- python - Python webapp 在 Heroku 上无法正常运行?
- python - Python,Numpy:无法将 numpy 数组的值分配给矩阵的列
- angularjs - Angularjs基于两个表选择组