.net - 没有根的托管对象会在下次 GC 运行期间被销毁吗?
问题描述
我正在尝试分析重负载下 .NET Web 应用程序的转储。
通过 WinDbg,我看到我的 GC 堆大约为 1GB。dumpheap 显示它填充了类似的托管对象,gcroot 为其返回:
Found 0 unique roots
我的问题是:我可以确定垃圾收集器会在下一次运行时销毁没有根的对象还是内存泄漏的迹象?
解决方案
我可以确定垃圾收集器会在下次运行时销毁没有根的对象吗?
不可以。垃圾收集器可以运行不同的代:0、1 和 2。只有当对象处于 GC 运行的同一代或更低代时才会被垃圾收集:
- 将始终收集第 0 代对象。
- 在第 1 代和第 2 代运行期间将收集第 1 代对象。
- 第 2 代对象只会在第 2 代运行时收集
此外,如果对象有终结器,它可能会在稍后运行 1 次 GC,因为必须先运行终结器。但在这种情况下,对象应该植根于 finalize 队列。
这是内存泄漏的迹象吗?
不,特别是如果你有像 一样string
的不可变对象,它们来来去去是很正常的(其中许多可能在 gen 0 中)。
推荐阅读
- laravel-6.2 - 一般错误:1005 无法创建表`learning`.`users`
- javascript - 在 react-native 中运行之前,如何让应用程序等待从从 firestore 获取数据的模块中获取所有数据?
- amazon-web-services - API Gateway Websockets - 接收数据后关闭客户端连接
- java - WebDriver 和 ChromeDriver 无法解析为类型
- vue.js - Vue2Leaflet 中的 noWrap?
- python - Scrapy 不会下载所有页面的所有图像
- sql - 在 SQL 数据库中使用以太坊地址作为主键
- java - 修改 calculateFittingCost() 方法,使其将可变劳动力成本乘以适当的成本乘数
- c# - 如何使用 .NET Core 压缩图像大小?
- html - 列未并排基础css