关于大对象堆(LOH)存储对象类型的技术咨询
关于大对象堆(LOH)存储对象类型的技术咨询
嘿,你说得没错,超过85000字节的数组和字符串确实会被分配到LOH里。不过除了这俩,还有不少其他类型也会“落脚”在LOH,我给你梳理几个常见的:
- 装箱后的大值类型:比如你把一个体积很大的
struct装箱成object时,如果这个结构体实例的大小超过85000字节,就会被放到LOH里。举个例子,一个包含上百个字段的自定义结构体,或者单个实例大小超标的值类型,装箱后都会进入LOH。 - 自定义大对象实例:如果你自己定义的类,它的单个实例在内存中的总占用量超过85000字节,也会被分配到LOH。比如类里包含多个大字段、嵌套了多个大对象,加起来总大小达标时,整个实例就会进入LOH。
- 部分.NET框架内部对象:比如用于IO操作的大型缓冲区、复杂正则表达式的匹配对象,或是WPF里的大型可视化元素等,当它们的内存占用超过阈值时,也会被放到LOH中。
- 特殊数组场景:比如数组的数组(交错数组),如果其中单个元素数组的大小超过85000字节,那这个元素数组会进入LOH;另外如果外层数组本身的总字节数(比如包含大量大数组的引用)超过阈值,外层数组也会被分配到LOH。
另外补充下,.NET不同版本对LOH的分配规则有微调,比如.NET Core 3.0+之后,LOH的阈值可以通过配置修改,但默认还是85000字节这个门槛。
备注:内容来源于stack exchange,提问作者VJAI
相关产品推荐
相关产品推荐

