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

C#-字符串可以存储在大对象堆(LOH)中吗?,c#,string,memory-management,garbage-collection,large-object-heap,C#,String,Memory Management,Garbage Collection,Large Object Heap,最近我在采访中被问到,C#中的字符串是否可以用于LOH。采访者提到GC逻辑中有一些优化,它将一个巨大的字符串分割成几个较小的字符串,所以这个字符串永远不会到达LOH 我在MSDN文章中没有找到相关信息: 及 那么,CLR中关于在LOH中存储字符串是否有任何暗示或优化?它是否与字符串实习有关?我认为面试官想了解字符串实习池,也称为LargeHeapHandleTable 其中一个错误是假设被实习的字符串位于LOH的字符串实习池中 实际上,一个内部字符串有一个散列,它位于LargeHeapHand

最近我在采访中被问到,C#中的字符串是否可以用于LOH。采访者提到GC逻辑中有一些优化,它将一个巨大的字符串分割成几个较小的字符串,所以这个字符串永远不会到达LOH

我在MSDN文章中没有找到相关信息: 及


那么,CLR中关于在LOH中存储字符串是否有任何暗示或优化?它是否与字符串实习有关?

我认为面试官想了解字符串实习池,也称为LargeHeapHandleTable

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

实际上,一个内部字符串有一个散列,它位于LargeHeapHandle表中,然后它引用小对象堆(SOH)或大对象堆(LOH)

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

[插入字符串的示例]


Kondrad Kokosa在第四章中描述了这一点,我想面试官想听听弦乐实习生池(也称为Largeheaphandleable)的情况

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

实际上,一个内部字符串有一个散列,它位于LargeHeapHandle表中,然后它引用小对象堆(SOH)或大对象堆(LOH)

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

[插入字符串的示例]


Kondrad Kokosa在第4章中对其进行了描述

我会回答说,这是一个非常具体的实施细节,很少有人知道,而且除了少数边缘情况外,很可能在所有情况下都没有显著的性能。了解c#如何在幕后工作是一项有用的额外技能,但不如了解编写好软件的“更高层次”概念重要。在面试中听到这样一个问题,我感到很惊讶,这就是为什么我想再次检查面试官的观点是否正确。我在给GC上了一堂非正式的内部课程。为了创建垃圾,我在一个
列表中添加了
count
新字符串('*',allocationSize)
的实例。
allocationSize
变量实际上是一个以平均值为中心的随机数。当平均值足够大时(即>85k),我观察到我认为是LOH效应。任何参与的人都可能相信我。没有这样的优化。我想知道面试官是怎么想到这个主意的……可能面试官把
string
(必须是一个连续的缓冲区)的实现与
StringBuilder
的实现搞混了(过去是单个可调整大小的缓冲区,类似于
列表
等,但目前是缓冲区的链接列表)。所有这些都是可以随时更改的实现细节,因此,作为一个学术问题,这并不是一个实际的编程问题。我会回答说,这是一个非常具体的实现细节,很少有人知道,而且除了一些边缘c外,很可能在所有方面都没有显著的性能例如,了解c#如何在引擎盖下工作是一项有用的额外技能,但不如了解“更高级别”重要编写好软件的概念。我很惊讶在面试中听到这样一个问题,这就是为什么我想再次检查面试官的观点是否正确。我正在给GC上一个非正式的内部类。为了创建垃圾,我有一个
列表
,其中添加了
count
新字符串的实例(“*”,allocationSize)。
allocationSize
变量实际上是一个以平均值为中心的随机数。当平均值足够大时(即>85k),我观察到我认为是LOH效应。参与的人可能都相信我。没有这样的优化。我想知道面试官是如何得出这样的想法的……可能面试官混淆了
string
(必须是单个连续缓冲区)的实现与
StringBuilder
(过去是一个可调整大小的缓冲区,类似于
List
,但现在是一个缓冲区的链接列表)的实现细节都可能随时发生变化,因此,作为一个学术问题,这并不是一个实际的编程问题。