Java 分代垃圾收集

Java 分代垃圾收集,java,garbage-collection,Java,Garbage Collection,据我所知,分代GC将对象分为几代。 在每个循环中,GC只运行一代 为什么??为什么只收集一代垃圾就足够了 附言:我从中了解所有这些。这并不总是足够的——只是通常足够了,所以它通过不检查可能仍然存在的对象来节省时间 每个对象都有一个生成,表示它已保存了多少垃圾收集。如果一个对象在几次垃圾收集中幸存下来,那么它也有可能在下一次垃圾收集中幸存下来 : 分代垃圾收集器做出以下假设: 对象越新,其生命周期越短 对象越老,其寿命就越长 较新的对象往往彼此有很强的关系,并且经常在同一时间访问 压缩堆的一部分

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

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

附言:我从中了解所有这些。

这并不总是足够的——只是通常足够了,所以它通过不检查可能仍然存在的对象来节省时间

每个对象都有一个生成,表示它已保存了多少垃圾收集。如果一个对象在几次垃圾收集中幸存下来,那么它也有可能在下一次垃圾收集中幸存下来

:

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

  • 对象越新,其生命周期越短
  • 对象越老,其寿命就越长
  • 较新的对象往往彼此有很强的关系,并且经常在同一时间访问
  • 压缩堆的一部分要比压缩整个堆快
正因为如此,您可以通过只收集较年轻的对象来节省一些时间,而收集较老的一代对象只能在没有释放足够内存的情况下进行。

这并不总是足够的——只是通常足够,所以它通过不检查可能仍然存在的对象来节省时间

每个对象都有一个生成,表示它已保存了多少垃圾收集。如果一个对象在几次垃圾收集中幸存下来,那么它也有可能在下一次垃圾收集中幸存下来

:

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

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

正因为如此,您可以通过只收集较年轻的对象来节省一些时间,而只收集较老的一代对象,如果这样做无法释放足够的内存。

答案确实存在

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

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


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

答案确实存在

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

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

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

如果您阅读中提供的I,您就会理解为什么它会这样做,循环是当白色设置内存被填满时

要对此场景进行优化,请使用内存 按代或内存进行管理 包含不同类型对象的池 年龄。垃圾收集发生在 每一代当一代 填满。对象是按 为较年轻的对象或 年轻一代,因为 婴儿死亡率大多数物体死亡 那里当年轻一代充满 它引起了一个小的收集。少数的 集合可以在以下条件下进行优化: 婴儿死亡率高。这个 此类托收的费用由 一阶,与 正在处理的活动对象数 收集。充满活力的年轻一代 死物收集得很好 迅速地。一些幸存的物体是 搬到了终身制的一代。什么时候 终身制的一代需要 收集有一个主要的收集 这通常要慢得多,因为 包含所有活动对象

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

如果您阅读中提供的I,您将理解为什么会这样做,循环是在白色设置内存被填满时进行的

要对此场景进行优化,请使用内存 按代或内存进行管理 包含不同类型对象的池 年龄。垃圾收集发生在 每一代当一代 填满。对象是按 为较年轻的对象或 年轻一代,因为 婴儿死亡率大多数物体死亡 那里当年轻一代充满 它引起了一个小的收集。少数的 集合可以在以下条件下进行优化: 婴儿死亡率高。这个 此类托收的费用由 一阶,与 正在处理的活动对象数 收集。充满活力的年轻一代 死物收集得很好 迅速地。一些幸存的物体是 搬到了终身制的一代。什么时候 终身制的一代需要 收集有一个主要的收集 这通常要慢得多,因为 在里面