JVM学习笔记(三) 垃圾回收

本文详细探讨了JVM中的垃圾回收机制,包括如何判断对象可回收(引用计数法、可达性分析算法)、四种引用类型,以及垃圾回收算法(标记清除、标记整理、复制)。此外,还讲解了分代垃圾回收策略、不同垃圾回收器的特点(串行、吞吐量优先、响应时间优先、CMS、G1)以及G1的回收阶段。最后,文章提到了垃圾回收调优的关键点,如内存、锁竞争、CPU占用和GC的优化策略。
摘要由CSDN通过智能技术生成

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

1.1 引用计数法

在这里插入图片描述

1.2可达性分析算法

  • JVM 中的垃圾回收器通过可达性分析来探索所有存活的对象
  • 扫描堆中的对象,看能否沿着 GC Root 对象为起点的引用链找到该对象,如果找不到,则表示可以回收
  • 可以作为 GC Root 的对象
    • 虚拟机栈(栈帧中的本地变量表)中引用的对象。
    • 方法区中类静态属性引用的对象
    • 方法区中常量引用的对象
    • 本地方法栈中 JNI(即一般说的Native方法)引用的对象

1.3 四种引用

541`UGJF2FM8Q33F9Q4B9YB.png

  1. 强引用

只有所有 GC Roots 对象都不通过 【强引用】 引用该对象,该对象才能被垃圾回收

  1. 软引用(SoftReference)

仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次出发垃圾回收,回收软引用对象
可以配合引用队列来释放软引用自身

  1. 弱引用(WeakReference)

仅有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用对象
可以配合引用队列来释放弱引用自身

  1. 虚引用(PhantomReference)

必须配合引用队列使用,主要配合 ByteBuffer 使用,被引用对象回收时,会将虚引用入队,
由 Reference Handler 线程调用虚引用相关方法释放直接内存

  1. 终结器引用(FinalReference)

无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由 Finalizer 线程通过终结器引用找到被引用对象并调用它的 finalize 方法,第二次 GC 时才能回收被引用对象。

2.垃圾回收算法

2.1 标记清楚

定义:Mark Sweep

  • 速度较快
  • 会产生内存碎片

image.png

2.2 标记整理

Mark Compact

  • 速度慢
  • 没有内存碎片
  • image.png

2.3 复制

Copy

  • 不会有内存碎片
  • 需要占用两倍内存空间

image.png

3.分代垃圾回收

image.png

  • 新创建的对象首先分配在 eden 区(伊甸园区)
  • eden 区空间不足时,触发 minor gc ,eden 区 和 from 区存活的对象使用 copy 复制到 to 中,存活的对象年龄加1,然后交换 from区 和 to区
  • minor gc 会引发 stop the world,暂停其他线程,等垃圾回收结束后,恢复用户线程运行
  • 当幸存区对象的寿命超过阈值时,会晋升到老年代,最大的寿命是 15(4bit)
  • 当老年代空间不足时,会先触发 minor gc,如果空间仍然不足࿰
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值