.net - 将对象固定在 LOH 中是否会影响 GC 性能?

标签 .net garbage-collection

我读到,在托管堆中固定对象会影响 .NET 中的 GC 性能,因为如果“妨碍”固定对象,GC 就无法压缩内存。但由于大型对象堆无论如何都不会被压缩,因此这不适用于 LOH 中的对象。固定 LOH 中的对象是否还有其他隐藏成本?或者我可以安全地将对象固定在 LOH 中而不降低 GC 性能吗?

最佳答案

好吧,仅仅因为大对象堆 (LOH) 未压缩并不意味着它未被收集The LOH is collected并将对象固定在那里将对 future 的分配产生影响。

由于对象被固定,它会有效地缩小 LOH 中的可用内存量(与持有引用时的情况相同)。当发出另一个分配大对象的请求时,如果 LOH 中有太多固定/保留的引用,则在分配更多大对象时可能会遇到问题。

当在垃圾收集的标记和清除部分完成标记时,CLR 可能会标记所有固定为根的引用,因此在这部分收集期间可能不会产生任何影响;如果有人保留对大对象的引用,它的行为也会相同。

由于释放在 LOH 上以相同的方式发生(该 block 被简单地标记为可用),因此此操作也不会受到影响。

最后,由于 LOH 未压缩,因此在 GC 期间此操作永远不会在此堆上发生,因此此处不会受到影响。

总之,LOH 上的分配肯定会受到对 LOH 上对象的固定引用的影响,而 LOH 上的集合很可能不会。

虽然我们不要忘记分配和持有大内存块通常会对系统产生影响,但这些评论严格来说是关于 LOH

关于.net - 将对象固定在 LOH 中是否会影响 GC 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7121518/

相关文章:

C# "Out Of Memory Exception"返回变量访问器

java - Java 有析构函数吗?

c# - 如何在 C# 中不区分大小写地解析 float 和 double (以覆盖 "infinity"等)?

.net - 使用 RNGCRYPTOSERVICEPROVIDER 生成指定范围内的随机数

c# - 为什么当返回类型为 Task<string> 时该方法返回一个字符串?

python - 使用 ctypes 访问未在方法映射表中公开的方法

.net - 在运行时获取XAML类型的URI

.net - .NET 4.0 网站加载速度更快是有原因的吗?

java - C中exit(0)和Java中System.exit(0)的实践

javascript - 释放 Javascript 对象使用的内存