0

最近在面试中被问到,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 中存储字符串的任何含义或优化?它是否与字符串实习有关?

4

1 回答 1

2

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

错误之一是假设实习字符串位于 LOH 的 String Intern Pool 中。

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

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

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

它在Kondrad Kokosa的第 4 章Pro .Net 内存管理中进行了描述

于 2021-02-24T21:29:31.360 回答