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

C# - can a string be stored in the Large Object Heap (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 的信息。

错误之一是假设 interned string 位于 LOH 的 String Intern Pool 中。

实际上,一个 interned string 有一个 hash,它位于 LargeHeapHandleTable 中,然后它引用 Small Object Heap(SOH) 或 Large Object Heap(LOH)。

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

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

它在第 4 章 Pro .Net Memory Management 中由 Kondrad Kokosa

描述