jvm垃圾回收

垃圾回收

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


1.1 引用计数法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lpPM9avQ-1646097996409)(C:\Users\l\AppData\Roaming\Typora\typora-user-images\image-20220119110136835.png)]


1.2 可达性分析算法

  • Java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象
  • 扫描堆中的对象,看是否能够沿着 GC Root 对象为起点的引用链找到该对象,找不到,表示可以回收
  • 哪些对象可以作为 GC Root?

1.3 四种引用

  • 强引用
    • 只有所有 GC Root 对象都不通过【强引用】引用该对象,该对象才能被垃圾回收
  • 软引用
    • 仅有软引用引用该对象时,在垃圾回收后,内存仍不足时会再次发出垃圾回收,回收软引用对象
    • 可以配合引用队列来释放软引用自身
  • 弱引用
  • 虚引用
    • 必须配合引用队列来使用,主要配合 ByteBuffer 使用,被引用对象回收时,会将虚引用入队,由 Reference Handler 线程调用虚引用相关方法释放直接内存
  • 终接器引用
    • 无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终接器引用入队 (被引用对象暂时没有被回收),再由 Finaizer 线程通过终接器引用找到被引用对象并调用他的 finalize 方法,第二次 GC 时才能回收被引用对象

2. 垃圾回收算法


2.1 标记清除

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9KXe0urx-1646097996411)(C:\Users\l\AppData\Roaming\Typora\typora-user-images\image-20220119173611122.png)]

优点:速度快

缺点:造成空间不连续,形成内存碎片


2.2 标记整理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kuspME8o-1646097996412)(C:\Users\l\AppData\Roaming\Typora\typora-user-images\image-20220119173930597.png)]

优点:使内存更加紧凑,不会造成内存碎片问题

缺点:速度较慢,需要进行其他一些操作


2.3 复制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cw0iBgmZ-1646097996413)(C:\Users\l\AppData\Roaming\Typora\typora-user-images\image-20220119175900042.png)]

优点:不会造成内存碎片

缺点:需要占用双倍内存空间


3. 分代垃圾回收

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3kTtSPY-1646097996414)(C:\Users\l\AppData\Roaming\Typora\typora-user-images\image-20220119182046369.png)]

  • 对象首先分配在伊甸园区域
  • 当新生代空间不足时,触发 minor gc ,伊甸园和 from 区存活的对象使用 copy 复制到 to 区域,让存活的对象年龄加1并且叫唤 from 和 to
  • minor gc 会引发 stop the world,暂停其它用户的线程,等垃圾回收结束,用户线程才恢复运行 (minor gc 的暂停时间比较短)
  • 当对象年龄超过阈值时,就会晋升至老年代,最大年龄是15 (4bit)
  • 当老年代空间不足,会先尝试触发 minor gc ,如果之后空间仍不足,那么触发 full gc ,也会引发 stop the world (暂停时间更长)

3.1 相关VM参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aBQysvZQ-1646097996415)(C:\Users\l\AppData\Roaming\Typora\typora-user-images\image-20220120092440551.png)]

  • 向堆中存入对象时,如果对象的大小大于了新生代伊甸园的大小,则会判断对象是否大于老年代的大小并且看是否能存入老年代,如果能,则对象提前晋升到老年代中,以解决内存紧张的情况,如果不能,则报出内存溢出异常

4. 垃圾回收器

4.1 串行

  • 单线程
  • 适合堆内存较小,适合个人电脑的情况

4.2 吞吐量优先

  • 多线程
  • 适合堆内存较大的场景,并且需要多核cpu支持
  • 让单位时间内,STW 的时间最短 (次数少)

4.3 响应时间优先

  • 多线程
  • 适合堆内存较大的场景,并且需要多核cpu支持
  • 尽可能让 STW (Stop The World) 的单次时间最短 (时间短)

4.4 G1

定义:Garbage First

适用场景

  • 同时注重吞吐量和低延迟,认的暂停目标是 200 ms

  • 超大堆内存,会将堆划分为多个大小相当的 Region

  • 整体上是标记+整理算法,两个区域之间是复制算法

1) G1 垃圾回收阶段

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9T7y45f8-1646097996416)(C:\Users\l\AppData\Roaming\Typora\typora-user-images\image-20220120151625986.png)]


2) Young Collection

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cEa1h3WT-1646097996417)(C:\Users\l\AppData\Roaming\Typora\typora-user-images\image-20220120155340657.png)]


3) Young Collection + CM
  • 在 Young GC 时会进行 GC Root 的初始标记
  • 老年代占用堆空间比例达到阈值时,进行并发标记 (不会STW),由 JVM 参数决定

4) Mixed Collection

会对E、S、O进行全面垃圾回收

  • 最终标记 (Remark) 会 STW
  • 拷贝存活 (Evacuation) 会 STW
5) Full GC
  • SerialGC (串行)
    • 新生代内存不足发生的垃圾收集 - minor gc
    • 老年代内存不足发生的垃圾收集 - full gc
  • ParallelGC (并行 )
    • 新生代内存不足发生的垃圾收集 - minor gc
    • 老年代内存不足发生的垃圾收集 - full gc
  • CMS
    • 新生代内存不足发生的垃圾收集 - minor gc
    • 老年代内存不足
  • G1
    • 新生代内存不足发生的垃圾收集 - minor gc
    • 老年代内存不足

5. 垃圾回收调优

相关文章

jinfo 命令可以用来查看 Java 进程运行的 JVM 参数,命令如下...
原文链接:https://www.cnblogs.com/niejunlei/p/5987611.ht...
java 语言, 开发者不能直接控制程序运行内存, 对象的创建都是...
jvm
1.jvm的简单抽象模型:  2.类加载机制     双亲委派模...
堆外内存JVM启动时分配的内存,称为堆内存,与之相对的,在代...
1.springboot和tomcat2.springcloud的请求如何通过网关鉴权?...