JVM复制算法相关问题

为什么新生代区域中对象只有极少数存活?为什么垃圾回收算法中的复制算法常用于新生代?

回答引用自chatgpt:
新生代区域中对象只有极少数存活的原因是因为新生代区域一般是用来存放新创建的对象,这些对象的生命周期比较短,很快就会被回收。而复杂的对象,比如大的数组或者长时间存活的对象,则会被分配到老年代区域。
垃圾回收算法中的复制算法常用于新生代的原因是因为新生代中的对象一般比较少,而且大部分对象的生命周期比较短,复制算法可以快速地回收这些对象并且减少内存碎片的产生。复制算法将新生代区域分为两个区域,每次只使用其中一个区域,当一个区域中的对象存活下来时,这些对象会被复制到另外一个未使用的区域中,然后清空原来的区域。这样可以保证新生代中的对象都被迅速回收,并且不会产生内存碎片。

  • 看下这篇博客,也许你就懂了,链接:jvm-垃圾回收器1(相关算法)
  • 除此之外, 这篇博客: JVM垃圾收集器中的 2.新生代算法:复制算法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清除掉,这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效,只是这种算法的代价是将内存缩小为了原来的一半,代价很高。

    1. 现代商业虚拟机都采用这种收集算法来回收新生代新生代中的对象98%是"朝生夕死"的,所以不需要按照 1:1 的比例来划分内存空间而是将内存分为一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 和其中一块Survivor,当回收时,将 Eden 和 Survivor 中还存活着的对象一次性复制到另外一块 Survivor 空间上,最后清理掉 Eden 和刚才用过的 Survivor 空间,HotSpot虚拟机默认 Eden 和 Survivor 的大小比例是8:1,也就是每次新生代中可用内存空间为整个新生代容量的90%,只有10%的内存会被浪费,当 Survivor 空间不够时,需要依赖其他内存(这里指老年代)进行分配担保

    2. 内存的分配担保:如果另外一块 Survivor 空间没有足够的空间存放上一次新生代收集下来的存活对象时,这些对象将直接通过分配担保机制进入老年代。