.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
相关产品推荐
相关产品推荐

