系列一、堆里面的分区:Eden、From、To、老年代各自的特点

一、堆里面的分区:Eden、From、To、老年代各自的特点

系列一、堆里面的分区:Eden、From、To、老年代各自的特点_第1张图片

        堆是对象共享的区域,也是垃圾回收器主要工作的地方。主要分为新生区、养老区和元空间,而这三块地方中GC主要工作在新生区和养老区,其中新生区占1/3、养老区占2/3,新生区又分为伊甸区和幸存者区,幸存者区又分为幸存者0区(From区),幸存者1区(to区),内存所占比例是8:1:1。垃圾回收主要有四大算法,分别是:1、引用计数器法  2、复制算法   
3、标记清除算法  4、标记压缩算法。
 
1、引用计数器法:
     工作原理:每次对对象的引用都维护一个计数器,当该对象的计数器为0的时候,说明没有引用指向该对象了,GC可以对该对象的内存空间进行回收了。
     缺点:(1)较难处理循环引用;
               (2)每次对对象的引用都需要维护引用计数器,且维护计数器本身也有一定的消耗;
 
2、复制算法:
     工作原理:首先,当伊甸区满的时候会第一次触发GC,把还活着的对象拷贝到From区,当伊甸区再次满的时候,第二次触发GC,这时候GC会扫描伊甸区+From区,对这两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区,同时把这些对象的年龄+1。
     备注:如果有对象的年龄到达了老年的标准,则复制到老年代区。   
 
     其次,清空伊甸区和From区中的对象。经过这次清空之后,原本的From区里边为空,变为了To区
     最后,To区和From区互换,原来的To区成为下一次GC时的From区。
     优点:不会产生内存碎片;
     缺点:GC第二次扫描拷贝存活的对象时,会导致内存减半
 
 
3、标记清除算法:
     标记清除一般发生在老年代。分为2个阶段:先标记出要回收的对象,然后统一回收这些对象。
     同通俗的话解释一下标记清除算法,是指程序运行期间,若可以使用的内存即将被耗尽时,GC线程将会被触发并将程序暂停,随后将要清除的对象标记一遍,最终统一回收这些对象,完成标记清理工作接下来便让应用程序恢复运行。
     
     两个阶段  
     标记:从引用根节点开始标记遍历所有的GC Roots,先标记出要回收的对象;
     清除:遍历整个堆,把标记的对象清除;
 
     缺点:此算法需要暂停整个应用,会产生内存碎片。
     
 
4、标记压缩算法:
     在整理压缩阶段,不再对标记的对象回收,而是将所有存活着的对象都向一端移动,然后直接清除边界以外的内存。可以看到标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存将会被整理掉。如此一来,当我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可,这比维护一个空闲列表显然少了许多开销。
     优点:标记压缩算法不仅可以弥补标记清除算法中,内存区域分散的特点,也消除了复制算法当中,内存减半的高额代价。
     缺点:比复制算法多了一个标记的阶段,又比标记/清除多了一个整理内存的过程。

你可能感兴趣的:(GC面试系列,GC)