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

目录

    • 1 被判定为垃圾的标准
    • 2 判定对象是否为垃圾的算法
      • 2.1 引用计数法
      • 2.2 可达性分析算法
    • 3 垃圾回收的算法
      • 3.1 标记-清除算法(Mark and Sweep)
      • 3.2 复制算法(Copying)适用于对象存活率低的场景(年轻代中),因为需要复制的对象少。年轻代与老年代后面会介绍到。
      • 3.3 标记整理(Compacting)适合存活率高(例如老年代中)
      • 3.4 分代收集算法(Generational Collector)
    • 4 常见垃圾回收器
      • 垃圾收集器
    • 5 强引用、软引用、弱引用、虚引用作用

1 被判定为垃圾的标准

没有被其它对象引用

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

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

2.1 引用计数法

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

优点
执行效率高(只需要查找出引用计数为0的即可),程序受影响小
缺点
当出现循环引用的时候(父对象有一个对子对象的引用,子对象又反过来引用父对象。或者出现两个对象相互引用),引用计数不可能为0,也就是不能被回收,可能造成内存泄露
比如:
Java的垃圾回收机制、年轻代与老年代_第1张图片

2.2 可达性分析算法

通过判断对象的引用链是否可达来判断对象是否可回收
Java的垃圾回收机制、年轻代与老年代_第2张图片
什么对象可以作为GC 的root对象
Java的垃圾回收机制、年轻代与老年代_第3张图片

3 垃圾回收的算法

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

标记:从根集合进行扫描,对存活的对象进行标记。
清除:对堆内存进行线性遍历,回收不可达对象内存。
Java的垃圾回收机制、年轻代与老年代_第4张图片

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

  • 分为对象面和空闲面
  • 对象在对象面中创建
  • 存活的对象会被复制到空闲面
  • 复制之后将对象面中所有对象全部清除
    Java的垃圾回收机制、年轻代与老年代_第5张图片

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

标记:从根集合进行扫描标记存活的对象
清除:移动所有存活的对象,按照内存地址次序依次排列,然后将末端地址以后的所有对象清除
Java的垃圾回收机制、年轻代与老年代_第6张图片

3.4 分代收集算法(Generational Collector)

年轻代、老年代、永久代?
Java的垃圾回收机制、年轻代与老年代_第7张图片
Java的垃圾回收机制、年轻代与老年代_第8张图片
年轻代:进可能快速收集生命周期短的对象
一般分为:一个Eden区,两个survivor区Java的垃圾回收机制、年轻代与老年代_第9张图片
年轻代回收演示(Minor GC):

对象在什么时候会进入老年代
1、当年龄到达默认最大值时,对象会晋升老年代。默认15,可通过该参数设置
Java的垃圾回收机制、年轻代与老年代_第10张图片
2、Survivor中放不下的
3、新生成的大对象在这里插入图片描述
分代收集算法特点
Java的垃圾回收机制、年轻代与老年代_第11张图片
**老年代:**存放生命周期较长的对象,使用标记-清理或标记-整理方法
Major GC 是清理永久代。
Full GC 是清理整个堆空间—包括年轻代和永久代。
Full GC比 Minor GC慢 ,但执行频率低
触发条件:
Java的垃圾回收机制、年轻代与老年代_第12张图片
常用调优参数
Java的垃圾回收机制、年轻代与老年代_第13张图片
分代收集的GC分类:

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

4 常见垃圾回收器

stop-the-world
Java的垃圾回收机制、年轻代与老年代_第14张图片
safepoint(安全点)
Java的垃圾回收机制、年轻代与老年代_第15张图片
JVM的运行模式

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

垃圾收集器

年轻代收集器
Java的垃圾回收机制、年轻代与老年代_第16张图片
Java的垃圾回收机制、年轻代与老年代_第17张图片
Java的垃圾回收机制、年轻代与老年代_第18张图片
老年代常用收集器
Java的垃圾回收机制、年轻代与老年代_第19张图片
Java的垃圾回收机制、年轻代与老年代_第20张图片
一般在硬件比较牛逼的时候(内存大):
Java的垃圾回收机制、年轻代与老年代_第21张图片
Garbage First
Java的垃圾回收机制、年轻代与老年代_第22张图片
会改变java堆内存布局
Java的垃圾回收机制、年轻代与老年代_第23张图片

关系
Java的垃圾回收机制、年轻代与老年代_第24张图片

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

Java的垃圾回收机制、年轻代与老年代_第25张图片
Java的垃圾回收机制、年轻代与老年代_第26张图片
Java的垃圾回收机制、年轻代与老年代_第27张图片
Java的垃圾回收机制、年轻代与老年代_第28张图片
Java的垃圾回收机制、年轻代与老年代_第29张图片

你可能感兴趣的:(JVM)