简述GC回收机制

本文详细介绍了Java垃圾收集(GC)的基本原理,包括内存类型、GC类型和对象回收流程。探讨了不同GC算法如根搜索算法、标记-清除、复制、标记-整理和引用计数法,并讨论了各种引用类型和可达性级别。最后,分析了主流的垃圾收集器,如新生代和老年代收集器,以及G1收集器的特点和应用场景。
摘要由CSDN通过智能技术生成

一、概述
    程序在运行过程中是不断申请内存,释放内存,如果程序只是申请没有释放就会引起内存泄漏内存不足等问题。在C语言、C++中,程序员需要手动的释放内存,如果程序员粗心忘记回收,就会导致程序bug,在Java中,JVM提供自动回收内存机制GC(内存回收器),减少程序员的工作量和减低由于人为导致内存问题。
二、基本原理
     将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停。
2.1 内存类型
    GC回收中的内存分为新生代和老年代, 新生代与老年代的比例的值为 1:2    ( 该值可以通过参数 –XX:NewRatio 来指定 ) 。
  • 新生代

    新生代是刚刚被释放的内存存放的地方,分为 Eden、From Survivor、To Survivor三个区(8:1:1) ,一般情况,from Survior和to Survivor有一个空闲(复制算法决定的)。

  • 老年代

    主要存放程序中年龄较大和需要占用大量连续内存空间的对象。 
    
2.2 GC类型
    GC根据回收的内存分为两种类型:新生代 GC(Minor GC)和老年代 GC(Major GC  / Full GC)
  • 新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java 对象大多都具
    备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。

  • 老年代 GC(Major GC / Full GC):指发生在老年代的 GC,出现了 Major GC,经常
    会伴随至少一次的 Minor GC(但非绝对的,在 ParallelScavenge 收集器的收集策略里
    就有直接进行 Major GC 的策略选择过程) 。MajorGC 的速度一般会比 Minor GC 慢 10
    倍以上。

  • Minor GC触发机制:
    当年轻代满时就会触发Minor GC,这里的年轻代满指的是Eden代满,Survivor满不会引发GC

  • Full GC触发机制:
    当年老代满时会引发Full GC,Full GC将会同时回收年轻代、年老代,

    当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载

2.3对象回收流程
  • 当Minor GC被触发的时候,new Generation被进行,可能触发1、2、3、4四种情况。

    1)经过minorGC后,eden区的数据如果还存活,执行1或者4。当eden的对象比较大或者survicor已经满了,执行4,直接永久代;否则操作1,进入则标记回收次数,数据进入survior区,进入from还是to,由survicor决定;

    2)survicor区的回收一般是使用标记复制算法,存活的数据从from进入to,或者to进入from,同时GC回收标记次数会jia1,当标记次数达到一定次数,触发3,对象进入老年代;

  • 当full GC时,会触发所有的GC操作,老年代的自我回收是5。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值