第0代: 所以我读到当gen 0超过大小阈值时gen 0触发。但我也读到GC不是在“新”中执行,因为“新”只是向前滑动地址。然后,什么时候检查它是否超过了触发gen 0 GC的阈值?
第1/2代: gen 1/2有自己的大小阈值触发GC吗?他们什么时候考虑门槛?是幸存者晋升为天才的那一刻吗?这是否意味着gen 1 GC发生它首先检查gen 0,然后将它们提升到gen 1,只发现gen 1超过了阈值,所以它检查gen 1,并再次检查gen 0?
这是否意味着第二代GC发生它首先检查gen 0,然后将它们提升到gen 1,只发现gen 1超过了阈值,因此它检查gen 1,并再次检查gen 0。然后将gen 0升级到gen 1,将gen 1升级到gen 2,只发现gen 2已经超过了阈值,所以它再次检查gen 2,gen 1,再次检查gen 0?
答案 0 :(得分:1)
CLR初始化后,首先添加到托管堆的对象被定义为Gen0。 GC执行时,未收集的对象的生成将增加1级并成为Gen1。之后创建的对象仍然是Gen0。创建对象时,仅当Gen0对象释放的内存不足以创建新对象,并且Gen1中的卷超出容量时,GC才会收集Gen0和Gen1对象。之后,Gen1中未收集的对象将成为Gen2,Gen0中未收集的对象将成为Gen1。之后创建的对象仍然是Gen0。
答案 1 :(得分:0)
当VM内存不足时,Gen 0会触发 当Gen 0没有释放足够的内存并且它仍然没有内存时,Gen 1会触发 当发明n - 1没有释放足够的内存并且它仍然没有内存时,Gen n会触发 如果它到达最后一代并且它仍然没有释放足够的内存,则分配新的内存。