jvm minor gc,major gc ,full gc学习笔记

1 minor gc,major gc ,full gc

jvm 在进行gc时,并非每次都对上面的上内存(新生代,老年代,方法区)区域一起回收,大部分回收的都是指新生代

对于hotspot vm 实现,它里面的gc按照回收区域分为两大类型:一种是部分收集(partial gc),一种是整堆收集(Full Gc)。

部分收集

  • 新生代收集(Minor gc / young gc):只是新生代的垃圾收集

  • 老年代收集(Major gc / old gc):只是老年代的垃圾收集

  • 整堆收集(Full gc):收集整个java堆和方法区的垃圾回收

1.1 年轻代GC(Minor GC) 触发机制

  • 当年轻代空间不足时,就会触发Minor Gc,这里的年轻代满指的是 eden 代满,survivor 满 不会引发Gc

  • 由于java 对象大多都具备朝生夕死的特性,所以minor gc非常频繁,一般回收速度也比较快

  • Minor gc 会引发stw,暂停其它用户的线程,等垃圾回收结束,用户线程才回复运行。

1.2 老年代Gc(major gc) 触发机制

  • 指发生在老年代的gc,对象从老年代消失

  • 出现major gc,经常会伴随至少一次的minor gc

  • major gc 的速度一般会比 minor gc 慢十倍以上,stw时间更长

  • 如果major gc 后内存还不组,就报oom

1.3 Full Gc触发机制

触发full gc 执行的情况有五种

  1. 调用System.gc()时,系统建议执行Full Gc,但是不必然执行

  2. 老年代空间不足

  3. 方法区空间不足

  4. 通过Minor gc 后进入老年代的平均大小大于老年代的可用内存

  5. 由eden 区,s0(from)区向s1(to)区复制时,对象大小大于to可用内存是,把对象转存到老年代,且老年代的可用内存小于该对象大小

说明:full gc 是开发或调优中尽量要避免的,这样暂时时间会短一些

2 堆空间分代思想

为什么要把java堆分代?不分代就不能正常工作了吗?

  • 由于不同对象的生命周期不同,70%~99%的对象时临时对象

    • 新生代:有eden ,s0,s1 构成
    • 老年代:存放新生代中经历多次gc仍然存活的对象

不分代也是可以的,分代的唯一理由就是优化gc性能,由于许多对象都是朝生夕死,把新建对象放到某一地方,当gc时先把此对象区域进行回收。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值