JVM组成总结,GC算法流程总结,详细

JVM学习总结

组成
  1. 程序计数器:线程私有,表明当前线程执行行数
  2. java虚拟机栈:基本类型,引用类型对应地址
  3. 本地方法栈:保存java原生方法的信息
  4. 堆:1/3年轻代+2/3老年代
  5. 方法区:持久代。存储类信息、常量、静态变量
    jvm 模型
GC
判断是否GC的方法
引用计数法

如果这个obj被引用,计数器+1,引用失效,计数器-1。当一个obj的引用计数器为0,就不代表被使用。
缺点:不能解决循环引用的问题

可达性分析算法

以GCroot为起点,向下搜索,经过的链为引用链,当一个obj没有任意一个到GCroot的引用链,证明他可以被回收。
可作为GCroot的对象:

  • java虚拟栈的引用对象
  • 方法区的静态属性、常量引用的对象
  • 本地方法区中引用的对象
GC算法
标记-清除

缺点:标记和清除所需时间长,会产生大量空间碎片,导致大的对象放不下

复制算法

原理:将Heap的Eden和Survivor from区有效对象复制到Survivor to区,并清理原空间,再交换from和to的指针

标记-整理算法

因为标记-清除-整理所需的时间很长,复制算法当遇到大量obj都有效时不是太好,因为会占用额外空间,所以在老年代才使用标记整理算法

分代整理算法
新生代、老年代对象存放原则
  • 对象优先在eden区分配
  • 大对象直接放入老年代
新生代GC回收算法采用的是复制算法;
考虑到大对象可能的存活时间长,频繁复制带来额外开销;
jvm通过设置参数值,当大于该值的对象直接放入老年代。
  • survivor区长期存活的对象移动到老年代
新生代工作流程:
1.对象放入eden区,直至eden区放不下该对象,发生youngGC
2.Young GC流程是将Eden中有效的对象和survivor from区拷贝到 survivor to区
3.清除eden区数据,将from和to指针交换
------
survivor from中的部分数据存活时间可能过长,频繁复制带来额外开销,
jvm通过利用age(每young gc交换一次 +1,默认15次)来判断是否将该对象移动到老年代,
当对象的age==15时,将其移动到老年代
  • survivor区动态规划
当survivor区发现有超过一半的对象age相同
jvm会把这些对象移动到老年代
  • 老年代担保原则
当发生youngGC之前,jvm会检查老年代剩余空间是否大于当前新生代所有数据
如果大于 直接顺利进行GC
如果不大于,则判定这是一次不安全的GC,通过检查设置是否运行不安全GC,
如果允许,则判断剩余空间是否大于历届youngGC平均值,如果是,直接进行youngGC
如果不是,则对老年代进行full GC后,再进行YoungGC
-----
ps: 因为full GC的标记-整理算法耗时是youngGC的复制算法10倍以上

补充

  • YoungGC 又叫 MinorGC
  • 有种说法是对新生代进行垃圾回收叫做minor GC,对老年代进行垃圾回收叫做major GC,同时对新生代、老年代和永久代进行垃圾回收叫做full GC
  • 事实上有种说法是对新生代进行垃圾回收叫做minor GC,对老年代进行垃圾回收叫做major GC这个是对的,最后一句话存疑,我所参考的深入理解java虚拟机,对full GC的表述和majorGC相同,因为再进行MajorGC后必会发生一次YoungGC
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值