JVM有哪些垃圾回收算法

1.新生代的垃圾回收算法是复制算法

2.新生代内存空间不足,会触发Minor GC回收掉新生代垃圾对象

新生代内存有两块内存区域

方法一:标记整理算法-------不好的垃圾回收思路

     直接对一块内存空间,回收垃圾对象,保留存活对象

问题:

       内存碎片太多,会造成大量的内存浪费.很多的内存碎片无法使用.

 

方法二: -------合理的垃圾回收思路

 复制算法:

       把新生代内存划分为两块内存区域,然后只使用一块内存,待那块内存快满的时候,把里面存活的对象一次性转移到另一块内存区域中,保证没有内存碎片,接着一次性回收原来的那块内存区域中的垃圾,再次空出来一块内存区域,两块内存区域就这么重复循环使用.

        缺点:

                 只有一半的内存可以使用,内存的使用效率低.

          复制算法的优化: Eden区和Survivor区

                绝大多数的对象都是周期非常短的对象,只有很少是长期存活的对象.

3.由复制算法衍生出来的新生的分区

      真正的复制算法是把新生代内存对象分为三块. 1个Eden区 和2个Survivor区 

      Eden区占80%  Survivor区占10%

     这样做的好处:

          只有10% 的内存空间是闲置的,90%的内存空间被使用上了.

         平时使用的是一块Eden区和一块Survivor区.

          Eden:Survivor=8:1

          对象刚开始时分配在Eden区,Eden区快满时,触发垃圾回收.此时把Eden区中的存活对象一次性转移到一块空着的Survivor区中,接着Eden区被清空,再次分配新对象到Eden区.     Eden区和一块Suivivor区中都是有对象的,其中Survivor区里存放的是上一次MinorGC后存活的对象.  如果下次Eden区满,再次触发MInor GC,就会把Eden区和放着上一次Minor GC后存活对象的Suivivor区中的存活对象,转移到另一块的Suivivor区中.

         始终保持一块Survivor区是空着的,就这样一直循环使用这三块内存区域. 

          这样垃圾回收的性能,内存碎片的控制,内存使用的效率都非常好.

                              

你可能感兴趣的:(JVM)