微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C# - 可以将字符串存储在大对象堆 (LOH) 中吗?

如何解决C# - 可以将字符串存储在大对象堆 (LOH) 中吗?

最近在面试中被问到,C#中的字符串能不能来LOH。面试官提到 GC 逻辑有一些优化,将单个大字符串拆分为几个较小的字符串,因此该字符串永远不会到达 LOH。

我在MSDN文章中没有找到相关信息: https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/large-object-heap https://docs.microsoft.com/en-us/archive/msdn-magazine/2008/june/clr-inside-out-large-object-heap-uncovered

那么在 CLR 中关于在 LOH 中存储字符串是否有任何影响或优化?它与字符串实习有某种关系吗?

解决方法

我认为面试官想了解 String Intern Pool 也称为 LargeHeapHandleTable。

其中一个错误是假设实习字符串位于 LOH 的字符串实习池中。

实际上,一个interned字符串有一个哈希值,它位于LargeHeapHandleTable中,然后它引用了小对象堆(SOH)或大对象堆(LOH)。

如果一个超过 85kb 的 interned 字符串将位于 LOH 中,在其他情况下它将在 SOH 中的第 2 代并存储直到应用程序完成。

[interned string 的例子] https://i.stack.imgur.com/fD0WR.png

Kondrad Kokosa 在第 4 章 Pro .Net Memory Management 中对此进行了描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。