JVM新生代复制算法简介

JVM中关于复制算法的引入及运转

针对新生代的垃圾回收算法是叫做复制算法

复制算法的引入

我们知道当新生代里的对象如果没有方法的局部变量和类的静态变量引用时,那么就会成为垃圾对象,当新生代内存中满了的时候,就会触发Minor GC,将垃圾对象回收,如果内存不够会将弱引用,软引用,虚引用对象也会回收,把内存空出来。
但是有一个问题,垃圾回收后,会保留着一些存活的对象,但这些对象在新生代的内存区域中时较为凌乱的分布,导致出现大量的内存碎片,进而导致内存空间被大量的浪费,因为没有一块完整的内存空间让我们存放对象,所以想方法将内存中的对象能够整理出来,将大量的内存碎片进行整合。

简单的复制算法

    1. 我们可以将新生代的内存分为两部分
    2. 新创建的对象放入其中一块区域A
    3. 当这块区域中的内存满了的时候将这块区域中幸存下来的对象转移到另一块区域中B,将A区域中的垃圾对象进行清理。
    4. 然后将新生的对象放入B区域中,等到B区域的内存空间也满了的时候,再重复上次操作进行垃圾回收

但是会发现一个很严重的问题,那就是空间被严重浪费,将新生代的内存分为两块,最好的就是各占50%。但是我们平时能够利用的内存空间也将降为50%,另一块内存区域只能被暂时闲置,因为需要等待上一块区域触发GC,将幸存对象进行整理。

复制算法的优化

优化思路

我们将内存区域划分为三块,分别为一块Eden(伊甸园区)两块Survivor(幸存区),其中Eden区占新生代的80%的内存空间,而两块Suivivor各占10%的幸存区域。

优化复制算法运转流程
  1. 平时使用的就是Eden区和一个幸存区,相当于是90%的内存区域
  2. 新生对象是创建在伊甸园区的,如果Eden区满了,那么就会触发Minor GC
  3. 此时就会把从Eden区幸存下来的对象一次性移到一块空着的Survivor区域,接着Eden区域就会被清空
  4. 此时,如果有新对象的创建则保存到Eden区域,此时内存中保留的则是Eden中保留的对象和一块Survivor中上一次Minor GC所存活下来的对象
  5. 如果下一次伊甸园区内存满了的时候,则将此次存活的对象和上次在幸存区存活的对象转移到另一块幸存区中。
优点

这样处理后内存中只有10%的内存是闲置的,无论时垃圾回收的性能还是碎片空间的利用还是内存使用的效率都非常的不错。

你可能感兴趣的:(JVM新生代复制算法简介)