垃圾回收小总结

1.如何判断对象可以回收

1.1引用计数法

a对象被引用了就计数+1,没被引用了就-1,到0了就回收

弊端:循环引用时两个对象的引用计数都是1,导致两个对象无法被释放

在这里插入图片描述

1.2可达性分析算法

可达性分析算法是以根对象集合(GCRoots)为起始点

  • 如果目标对象没有任何引用链相连,则是不可达的,就意味着该对象己经死亡,可以标记为垃圾对象。
  • 在可达性分析算法中,只有能够被根对象集合直接或者间接连接的对象才是存活对象。

GC Root

  1. 虚拟机栈中引用的对象

        比如:各个线程被调用的方法中使用到的参数、局部变量等。
    
  2. 本地方法栈内 JNI(通常说的本地方法)引用的对象

  3. 方法区中类静态属性引用的对象

        比如:Java类的引用类型静态变量
    
  4. 方法区中常量引用的对象

        比如:字符串常量池(string Table)里的引用
    
  5. 所有被同步锁 synchronized 持有的对象

  6. Java虚拟机内部的引用。

        基本数据类型对应的 Class 对象,一些常驻的异常对象(如:NullPointerException、OutOfMemoryError),系统类加载器。
    
  7. 反映 java 虚拟机内部情况的 JMXBean、JVMTI 中注册的回调、本地代码缓存等。

2.垃圾回收算法

标记清除

扫描堆 通过可达性分析判断是否 回收 ,能就作上标记。然后再进行清除(不是把字节清0,记录始末地址,要用的时候进行覆盖)

  • 优点:速度快
  • 缺点:容易产生内存碎片

在这里插入图片描述

标记整理

通过可达性分析算法 标记出存活对象 然后再改变位置使得紧凑放在一起

  • 优点:没有内存碎片
  • 缺点:地址发生改变,速度慢
    在这里插入图片描述

复制

创建一个相同的空间作为to,通过可达性分析算法 找出存活的对象 将存活的对象复制到to区域中,然后清空from,再把两块区域交换形成to永远为空的场景。

  • 优点:不会产生内存碎片
  • 缺点:需要占用双倍内存空间
    在这里插入图片描述

3.分代回收策略

具体实现上述各种回收算法,结合使用

在这里插入图片描述

流程

新创建的对象会被放入 新时代中的伊甸园中,如果伊甸园满了 触发垃圾回收机制Minor GC。 就执行可达性分析判断目前存活对象,采用复制算法把伊甸园存活对象放入幸存区to中 寿命从0开始+1,然后幸存区from和to交换位置,让to始装保持空的状态。

minor gc 触发stop the world (就是会暂停其他线程)

默认极限寿命到15时 就会把该对象放入 堆中的老年代中。

假设性老年代满了 就会先使用minor gc ,如果还不够就触发full gc

假设性新生代和老年代都满了 就出发垃圾回收 Full GC 全盘扫描 释放空间

4.垃圾回收器

4.1串行垃圾回收器

Serial 收集器

  • 单线程

  • 堆内存小,适合个人电脑

工作模式:

新生代–>复制算法 老年代–>标记整理

执行minor gc的时候 用户线程进入安全点 阻塞状态,此时启动垃圾回收线程 垃圾回收完毕之后 用户线程继续运行

4.2吞吐量优先的垃圾回收器

Parallel Scavenge 收集器(新生代) Parallel Old 收集器(老年代)

  • 多线程

  • 堆内存大,多核cpu

  • 单位时间内STW时间最短 例如:1h内 每次0.1+0.3 =0.4 单位时间1h内 很短
    在这里插入图片描述

4.3响应时间优先

CMS 收集器 。Concurrent Mark Sweep,一种以获取最短回收停顿时间为目标的老年代收集器

  • 多线程

  • 堆内存大,多核cpu

  • 考虑尽可能让单次STW(stop the world)时间最短 例如:1h内 每次0.1+0.1+.1 +0.1 =0.4 每次都很短

在这里插入图片描述

新生代 复制 ;老年代 标记清楚;

初始标记和重写标记的时候会STW(都很短暂)

并发标记之后再并发重写标记(并发标记的时候用户线程可能改变了对象的引用 又产生了新的垃圾)

初始标记 根对象

出现并发问题之后会退化为 串行 full gc

Remark重新标记

就是说在并发标记完了之后,又有用户线程改变了对象的引用,然后你再给他重写标记一下,看到底回不回收

黑色处理完毕,灰色正在处理,白色还未处理。看最后颜色状态判断是否存活。

在这里插入图片描述

4.4Garbage First
  • 同时注重吞吐量和低延迟(响应时间)
  • 超大堆内存(内存大的),会将堆内存划分为多个大小相等的区域
  • 整体上是标记-整理算法,两个区域之间是复制算法

新生代内存不足发生的垃圾回收------minor gc

老年代内存不足的垃圾回收---------分类讨论:

​ 1.如果回收速度大于新产生垃圾速度则不触发full gc,继续并发收集

​ 2.反之则触发

G1垃圾回收阶段

首先对新生代伊甸园进行回收 ------->老年代内存不足时,新生代回收+并发标记 ----------->混合回收(回收新生代伊甸园、幸存区,老年代)------->重新开始

在这里插入图片描述

Young Collection阶段

堆被分为一块块区域,每块区域都可以作为 伊甸园 幸存区 老年代。

在这里插入图片描述

Young Collection + CM阶段

在这里插入图片描述

Mixed Collection

会对E S O 进行全面的回收

  • 最终标记
  • 拷贝存活

:为什么有的老年代被拷贝了,有的没拷贝?

因为指定了最大停顿时间,如果对所有老年代都进行回收,耗时可能过高。为了保证时间不超过设定的停顿时间,会回收最有价值的老年代(回收后,能够得到更多内存)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值