Java的垃圾回收机制、年轻代与老年代

1 被判定为垃圾的标准

没有被其它对象引用

2 判定对象是否为垃圾的算法

  • 引用计数法
  • 可达性分析算法

2.1 引用计数法

通过判断对象的引用数量来决定对象是否可以被回收
每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1。
任何引用计数为0的都可以被当做是垃圾。

优点
执行效率高(只需要查找出引用计数为0的即可),程序受影响小
缺点
当出现循环引用的时候(父对象有一个对子对象的引用,子对象又反过来引用父对象。或者出现两个对象相互引用),引用计数不可能为0,也就是不能被回收,可能造成内存泄露
比如:
在这里插入图片描述

2.2 可达性分析算法

通过判断对象的引用链是否可达来判断对象是否可回收
在这里插入图片描述
什么对象可以作为GC 的root对象
在这里插入图片描述

3 垃圾回收的算法

3.1 标记-清除算法(Mark and Sweep)

标记:从根集合进行扫描,对存活的对象进行标记。
清除:对堆内存进行线性遍历,回收不可达对象内存。
在这里插入图片描述

3.2 复制算法(Copying)适用于对象存活率低的场景(年轻代中),因为需要复制的对象少。年轻代与老年代后面会介绍到。

  • 分为对象面和空闲面
  • 对象在对象面中创建
  • 存活的对象会被复制到空闲面
  • 复制之后将对象面中所有对象全部清除
    在这里插入图片描述

3.3 标记整理(Compacting)适合存活率高(例如老年代中)

标记:从根集合进行扫描标记存活的对象
清除:移动所有存活的对象,按照内存地址次序依次排列,然后将末端地址以后的所有对象清除
在这里插入图片描述

3.4 分代收集算法(Generational Collector)、堆模型

年轻代、老年代、永久代?
在这里插入图片描述
在这里插入图片描述
年轻代:进可能快速收集生命周期短的对象
一般分为:一个Eden区,两个survivor区在这里插入图片描述
年轻代回收演示(Minor GC):
在这里插入图片描述
对象在什么时候会进入老年代
1、当年龄到达默认最大值时,对象会晋升老年代。默认15,可通过该参数设置
在这里插入图片描述
2、Survivor中放不下的
3、新生成的大对象在这里插入图片描述
分代收集算法特点
在这里插入图片描述
**老年代:**存放生命周期较长的对象,使用标记-清理或标记-整理方法
Major GC 是清理永久代。
Full GC 是清理整个堆空间—包括年轻代和永久代。
Full GC比 Minor GC慢 ,但执行频率低
触发条件:
在这里插入图片描述
常用调优参数
在这里插入图片描述
分代收集的GC分类:

  • Minor GC (年轻代中的垃圾收集,采用复制算法)
  • Full GC 老年代中,由于对老年代的回收一般会伴随年轻代,所以叫做Full GC

4 常见垃圾回收器

stop-the-world
在这里插入图片描述
safepoint(安全点)

JVM的运行模式

  • server 启动慢,使用重量级的虚拟机,但是运行稳定之后比client执行速度快
  • client 启动快
    使用 java -version 就可以查看使用的是那种模式
    在这里插入图片描述

垃圾收集器

年轻代收集器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
老年代常用收集器
在这里插入图片描述
在这里插入图片描述
一般在硬件比较牛逼的时候(内存大):
在这里插入图片描述
Garbage First
在这里插入图片描述
会改变java堆内存布局
在这里插入图片描述

关系
在这里插入图片描述

5 强引用、软引用、弱引用、虚引用作用

###
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值