【问题标题】:C# - can a string be stored in the Large Object Heap (LOH)?C# - 可以将字符串存储在大对象堆 (LOH) 中吗?
【发布时间】:2021-05-27 01:30:08
【问题描述】:

最近在面试中被问到,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

那么对于在 LOH 中存储字符串,CLR 有什么影响或优化吗?它是否与字符串实习有关?

【问题讨论】:

  • 我会回答这是一个非常具体的实现细节,极少人会知道,除了少数几个边缘情况外,它很可能在所有情况下都没有显着的性能.了解 C# 如何在底层工作是一项有用的奖励技能,但不如了解编写优秀软件的“高级”概念重要。
  • 在面试中听到这样的问题我很惊讶,这就是为什么我想仔细检查面试官的看法是否正确
  • 我正在给一个关于 GC 的非正式内部课程。为了创建垃圾,我有一个List<string>,我在其中添加了countnew string('*', allocationSize) 实例。 allocationSize 变量实际上是一个以平均值为中心的随机数。当平均值变得足够大(即 > 85k)时,我观察到了我认为的 LOH 效应。任何参与的人都可能相信我。
  • 没有这样的优化。不知道面试官怎么会有这样的想法……
  • 可能面试官混淆了string 的实现(它必须是一个连续的缓冲区)和StringBuilder 的实现(过去是一个可调整大小的缓冲区,类似于@ 987654329@ 等,但当前是缓冲区的链接列表)。所有这些都是可能随时更改的实现细节,因此对于学术问题来说,真正的实际编程问题并不多。

标签: c# string memory-management garbage-collection large-object-heap


【解决方案1】:

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

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

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

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

[内嵌字符串示例]https://i.stack.imgur.com/fD0WR.png

第 4 章 Pro .Net Memory Management 由 Kondrad Kokosa 描述

【讨论】:

    猜你喜欢
    • 2010-10-16
    • 2021-12-29
    • 2017-11-16
    • 2010-12-30
    • 2019-02-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多