返回

Eden、from、to:揭秘新生代对象的生存之旅

Android

新生代:对象存活率低,采用复制算法

新生代是Java虚拟机中一个重要的内存区域,用于存放新创建的对象。由于新创建的对象往往存活时间较短,因此新生代的垃圾回收非常频繁。为了提高垃圾回收效率,新生代采用复制算法。

复制算法的运作机制

复制算法是一种简单高效的垃圾回收算法。其基本思想是将堆分为两个区域:Eden区和Survivor区。Eden区用于存放新创建的对象,Survivor区用于存放从Eden区复制过来的对象。

当Eden区满了时,会触发一次垃圾回收。垃圾回收时,将Eden区中存活的对象复制到Survivor区,然后将Eden区清空。Survivor区中的对象如果仍然存活,则在下次垃圾回收时复制到另一个Survivor区。

Survivor区也有一个年龄计数器,每次垃圾回收时,将Survivor区中的对象年龄加1。当Survivor区中的对象年龄达到一定阈值时,会被移动到老年代。

新生代中的对象存活之旅

新生代中的对象存活之旅可以分为以下几个阶段:

  1. Eden区: 新创建的对象首先存储在Eden区。
  2. Survivor区: 当Eden区满了时,触发一次垃圾回收。垃圾回收时,将Eden区中存活的对象复制到Survivor区。
  3. 老年代: 当Survivor区中的对象年龄达到一定阈值时,会被移动到老年代。

Eden、from、to:新生代的三个区域

在新生代中,堆被分为三个区域:Eden区、from区和to区。Eden区用于存放新创建的对象,from区和to区用于存放从Eden区复制过来的对象。

每次垃圾回收时,将Eden区中存活的对象复制到from区,然后将Eden区清空。在下一次垃圾回收时,将from区和Eden区中的存活对象复制到to区,然后将from区和Eden区清空。

依此往复,新生代中的对象不断在Eden区、from区和to区之间复制。当对象在Survivor区中的年龄达到一定阈值时,会被移动到老年代。

复制算法的优点和缺点

复制算法是一种简单高效的垃圾回收算法,具有以下优点:

  • 简单易懂,实现起来非常方便。
  • 效率高,垃圾回收速度快。
  • 内存利用率高,不会产生内存碎片。

复制算法也有以下缺点:

  • Eden区和Survivor区的大小是固定的,如果Eden区太小,则会导致频繁的垃圾回收。
  • 复制算法会产生额外的内存开销,因为需要复制对象。

总结

新生代是Java虚拟机中一个重要的内存区域,用于存放新创建的对象。新生代采用复制算法,将堆分为Eden区、from区和to区,不断在这些区域之间复制对象,直到对象年龄达到一定阈值时,被移动到老年代。复制算法简单高效,但也有Eden区大小固定和内存开销大的缺点。