深入理解JVM学习笔记(二十二、JVM 垃圾回收机制---如何回收垃圾---回收策略【复制算法】)

        上一节我们讲到了标记-清除算法因为需要进行两次内存扫描导致效率不高,那么这一节我们介绍一种复制算法,比较好的解决了这个问题。

       讲复制算法前,我们先回顾一下JVM的内存结构。JVM内存大体分为两大块,分别为线程共享区、线程独占区。其中线程共享区主要包括堆内存、方法区。线程独占区主要包括栈内存、本地方法栈、程序计数器。而我们垃圾回收主要针对的是线程共享区的堆内存。

        划重点,划重点,划重点。接下来将是本系列博客第一次提及JVM的两个很重要的概念,新生代和老年代。

        为了方便垃圾回收,我们的的堆内存又分为两块区域,新生代老年代。为什么要这么问,接下来讲复制算法时候会细细道来。那么新生代又会被分为四块区域:Eden(伊甸园)[内存占比80%]、Survival1(存活区1)[内存占比10%]、Survival2(存活区2)[内存占比10%]、Tenured(终身区)[担保内存区,额外空间]。那么问题来了,这四个区域是怎么和复制算法完美契合的呢。接下来结合复制算法的逻辑做以下说明:

        1、刚开始创建的新对象会被放入Eden(伊甸园)。

        2、垃圾回收机制被触发,垃圾回收器扫描Eden(伊甸园)、Survival1(存活区1)中可被回收的对象将其回收。将不可被回收的对象复制到Survival2(存活区2)中。

        3、下一次垃圾回收机制被触发,垃圾回收器扫描Eden(伊甸园)、Survival2(存活区2)中可被回收的对象将其回收。将不可被回收的对象复制到Survival1(存活区1)中。

        4、当扫描Survival中对象若还不可被回收则可能将其放入Tenured(终身区)中。

        5、以此往复扫描Eden(伊甸园)和Survival中的一个区域。将存活对象放入Survival中另外一个区域中。

思考问题:

        倘若我们不可被回收的内存超过10%,Survival区域放不下怎么办?

        答:将年岁最大的内存扔进老年代中。

你可能感兴趣的:(JVM)