世代垃圾收集

时间:2011-03-30 20:06:20

标签: java garbage-collection

据我所知,世代GC将对象分为几代 在每个周期中,GC只运行一代。

为什么呢?为什么垃圾收集只有一代就足够了?

P.S:我从 here 了解所有这些。

3 个答案:

答案 0 :(得分:3)

如果您阅读了我在link中提供的earlier question you had about Generational GC,您就会理解为什么会这样做,这个周期是白色套装内存填满的时候。

  

为此方案优化内存   是在几代人或记忆中管理的   池中持有不同的对象   年龄。垃圾收集发生在   每一代人的时代   填上。对象分配在   生成年轻的物体或   年轻一代,因为   婴儿死亡率大多数物体死亡   那里。当年轻一代填补   它会导致一个小的收集。次要   可以假设优化集合   婴儿死亡率高。该   这些收藏的成本是   第一顺序,与...成比例   活的对象数量   集。年轻一代充满了   非常收集死亡的物体   很快。一些幸存的物体是   搬到了终身一代。什么时候   终身一代需要   收集了一个主要的收藏品   这通常要慢很多,因为它   涉及所有活动对象。

基本上,每个对象被分为几代(基于关于对象的假设)并将它们放入特定世代的内存堆中。当内存堆被填满时,GC循环开始,那些仍然引用的对象被移动到另一个内存堆并添加新的对象。

答案 1 :(得分:1)

每个对象都有一代,说它存活了多少垃圾收集。如果一个对象在一些垃圾收集中幸存下来,那么它很可能会在下一个垃圾收集中存活下来。

MSDN has a great explanation

  

分代垃圾收集器做出以下假设:

     
      
  • 对象越新,其生命周期就越短。
  •   
  • 对象越旧,其生命周期就越长。
  •   
  • 较新的对象往往彼此之间存在很强的关系,并且经常在同一时间访问。
  •   
  • 压缩堆的一部分比压缩整个堆快。
  •   

因此,您可以通过仅尝试收集较年轻的对象来节省一些时间,并且只有在没有释放足够内存的情况下才收集老一代。

答案 2 :(得分:1)

答案是真的。

  

根据经验观察,在许多程序中,最近创建的对象也是最有可能快速无法到达的对象(称为婴儿死亡率或代际假设)。

  

分代垃圾收集是一种启发式方法,并且在每个周期中可能无法回收一些无法访问的对象。因此,有时可能需要执行完整标记并扫描或复制垃圾收集以回收所有可用空间。

基本上,代际集合以完整性为代价为您提供比完整垃圾收集更好的性能。这就是为什么在实践中使用两者的混合物。