You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.Net中对象大小超过Gen 0时会怎样?我的面试回答是否正确?

.NET GC中对象大小超过Gen0设定大小的行为解析

嗨,咱们把这两个问题放在一起说清楚,毕竟核心逻辑是相通的~

问题1:对象大小超过Gen0设定大小会发生什么?

首先得明确一个关键区分:.NET的GC把对象分为小对象和大对象,默认的大对象阈值是85,000字节(约83KB,不同.NET版本可能有微调)。

  • 如果你的对象是大对象(超过85KB):不管Gen0的大小是多少,这个对象会直接被分配到大对象堆(LOH),完全绕开Gen0/Gen1/Gen2的小对象堆。
  • 如果你的对象是小对象(小于等于85KB),但大小超过了当前Gen0的剩余可用空间:
    • GC会先触发一次Gen0垃圾回收,清理掉Gen0中不再被引用的对象,释放空间。
    • 如果回收后的Gen0有足够空间容纳这个对象,就直接分配进去。
    • 如果回收后空间还是不够,CLR会动态扩展Gen0的内存区域来容纳这个对象(Gen0的大小本来就是CLR根据应用分配模式动态调整的,不是固定死的)。

问题2:Gen0大小为5KB,创建20KB对象的情况

你之前回答“CLR会扩展Gen0区域”是部分正确,但漏了关键的前置步骤:
20KB属于小对象(远低于85KB的大对象阈值),所以会先尝试在Gen0分配。但Gen0只有5KB,剩余空间肯定不够,这时候GC会先跑一次Gen0的回收,把没用的对象清掉。如果回收后Gen0能腾出20KB以上的空间,就直接分配;如果回收后还是不够,CLR才会扩展Gen0的大小来放下这个对象。

补充个小知识点:Gen0的初始大小是CLR根据应用类型(比如桌面应用、ASP.NET等)预设的,但它不是固定值——CLR会持续监控你的应用分配行为,动态调整各代的大小,优化内存使用和GC性能。


内容的提问来源于stack exchange,提问作者Chealsea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:20:58