首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我的对象大于.Net中的Gen 0大小,会发生什么情况?

如果我的对象大于.Net中的Gen 0大小,会发生什么情况?
EN

Stack Overflow用户
提问于 2018-01-24 11:22:05
回答 6查看 852关注 0票数 9

在一次面试中,面试官问我如下:

假设Gen 0的大小为5kb,而我正在创建的对象大小为20 kb,会发生什么?

我回答说CLR将扩展Gen 0区域。

现在我很困惑,这是否是正确的答案。

这是正确的吗?

EN

回答 6

Stack Overflow用户

发布于 2018-01-24 11:46:25

具体细节取决于实现,在不同的框架版本之间可能略有差异。Gen0和Gen1并不打算增长,而Gen2可以无限期地增长。突破Gen0和1的限制通常会触发一个集合。

第1代和第0代生活在所谓的短暂段(每个堆中的第一个小对象段),Gen 1和Gen 0的大小永远不能超过段的大小。如果创建了一个新段,这将成为新的临时段。另一方面,第二代可以无限期地增长(或者直到内存耗尽),因此,如果你的内存消耗很高,那么大量的对象就会存在于第二代中。

在我处理大型ETL进程的经验中,大型数据对象往往被相当快地分配给Gen2,而Gen2垃圾收集相对较少,因此这些对象可以停留一段时间。

文章https://blogs.msdn.microsoft.com/tess/2008/04/17/how-does-the-gc-work-and-what-are-the-sizes-of-the-different-generations/给出了一个很好的概述,以及一些相关的链接。

票数 1
EN

Stack Overflow用户

发布于 2018-01-24 12:09:52

你将得到25K的第0代,除非发生了一些疯狂的事情(比如另一个线程分配了一堆内存,或者GC会因为其他代太大而被触发)。

第0代的预算一般要比25k大得多(默认是256 K),所以分配这个数额不会有什么特别之处。对象本身不大于85K,因此它也不会在大对象堆中结束。

数字(5K和20K)有点奇怪,因为它们并不接近任何有趣的事情发生的阈值。

票数 1
EN

Stack Overflow用户

发布于 2018-01-26 02:45:40

陆恭蕙不等于第二代

大多数大于85K的对象将直接分配给LOH。

但是第二代对象可以是很小的,它只存在于第0代和第1代,而第二代仍然是紧凑的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48421294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档