学习笔记 2021.10.26

2021/10/26 23:15:32

本文主要是介绍学习笔记 2021.10.26,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

2021.10.26

JVM

垃圾回收器

Parallel回收器

概述

image-20211026195442841

  • 与parnew主要的区别就是对控制量的要求有区别,其实也可以发现其他的方面很多都是一样的。

image-20211026195559634

  • 注意就是高吞吐量的注重就是不能够有太多的交互。后台运算的例子也如上图所示。
  • parallel old除了在并行上的区别话,也没有更多的新东西了。
  • 在程序吞吐量优先的情况下,这个垃圾回收器组合是很适用的。

该垃圾回收器相关的参数设置

image-20211026195958377

  • parallel的新生代和老年代的垃圾回收器是配套激活的。
  • 关于cpu数量和并行线程数的设计也根据实际情况而定即可。

image-20211026200153031

image-20211026200323223

  • 自适应调节开启后会尽可能使垃圾回收器满足吞吐量的要求。
  • 是一种自动实现的功能,能够自动的去调节堆中空间的比例。

CMS垃圾回收器(重在低延迟)

image-20211026200545877

基本的工作原理:

image-20211026200904713

  • 初始标记阶段会将所有的进程停了,主要任务在于标记出GC roots能够直接关联到的对象,因此虽然是stw的,但由于操作量比较小,所以速度非常快。
  • 并发标记时即从上面的对象开始遍历整个链的过程,虽然时间长但是不消耗用户线程。
  • 重新标记,用于修正具体过程见下图

image-20211026201315912

  • 并发清理阶段即是删除掉那些已经标记死亡的对象,释放内存空间,该过程也是并发的。此时也可以注意到因为只进行了标记清除,随意最后会存在碎片化的内存空间,后面存储时要采用空闲列表的方式。

一些其他的相关注意点:

image-20211026201546725

为什么不用标记清除压缩算法的原因

image-20211026201738091

反正就是要保证并发的特性,即不能够影响其他正在进行的线程。

总结:

image-20211026201821678

  • 浮动垃圾即是在并发标记阶段新产生的垃圾。

CMS设置中相关的一些参数设置,有个印象即可,毕竟是现在已经淘汰的垃圾回收器了。

image-20211026202135421

image-20211026202226790

已知垃圾回收器的总结:

image-20211026202409718

老年代的垃圾回收器自然也是配套的。

G1垃圾回收器(现在的默认垃圾回收器)

引入的原因?

image-20211026202731647

需要更好的暂停时间和吞吐量的折衷。

命名为G first的原因:

image-20211026203005222

  • 回收价值最大的意思即是回收过后回收对象最多的区域。
  • G1是面向服务端的垃圾回收器。主要针对配备多核cpu及大容量内存的机器,以同时满足两种指标。

常见的使用场景

image-20211026210634987

G1的优点
  • 并行与并发:

image-20211026203341712

  • 分代收集

image-20211026205558054

即将堆空间的划分都直接变化了。

此时分区就不要求内存空间连续并且固定是哪种了,具体示例见下图。此时每一个单位就叫region。

image-20211026205637326

其中Humongous主要用于存储大对象,如果超过1.5个region,则放到这个区。

  • 空间整合

image-20211026205656197

  • 可预测的停顿时间模型:

image-20211026205823750

其中价值最大的region的定义前面也已经有提到过了。

G1的缺点

image-20211026210016781

即G1需要占用额外的内存空间。

G1的参数设置

具体的应用有需求时再看,这里有个概念知道即可。

image-20211026210202047

  • 在设置最大停顿时间这,也不是说越小越好,太小的话会导致每次垃圾收集时选择的收集的区域就很少,进而会造成内存空间的堆积。
  • 一般使用时就三步:开启垃圾回收器、设置堆的最大内存、设置最大的停顿时间。剩下的都会自动去处理。
region的使用介绍

堆中region每个的大小都相同,且生命周期都不会被改变。虽然还保留着新生代老年代的区别,但不再是物理隔离的了,通过region动态分配的方式来实现逻辑上的连续。

额外的需要注意的一点:

image-20211026211222707

每个region的图例:

image-20211026211322321

即有个指针指向当前空的位置。

回收的主要过程细节:

主要包含以下三个环节

image-20211026211458130

最后一点即是不得不强制执行full GC的时候。

整体的说明:

image-20211026211559888

记忆集:即G1需要的额外的执行空间

image-20211026213354020

具体示例

image-20211026213517628

即额外多开辟一块空间用于记录引用了该对象的region。从而在后面的回收过程中不用全部遍历了。

回收过程一:年轻代GC

image-20211026213715519

  • 当且仅当伊甸区耗尽时才会触发,s区的垃圾回收都是被动触发的。
  • image-20211026213828490

上图即体现了新生代几种的转移过程,包括到s区以及从s区到老年区等等。

具体的回收过程

年轻代GC

image-20211026213921514

  • 记忆集主要就是年轻代GC这里使用,因为后面都是一起调用的。
  • 脏卡表用于记录对象间的各种引用,然后是记录后统一处理,更新rset。
  • 最终伊甸区为空,就放入空闲列表中用于后面的使用。
  • 这一步是一个独占式的GC。

并发标记过程

image-20211026214239437

  • 二的原因即是youg GC会动s区
  • 三中蓝色的部分也叫做实时回收。
  • 再次标记即是对前面并发过程新产生的处理。

混合回收

image-20211026214523178

蓝色部分即是G1特性的体现,保证延时足够的情况下尽可能的去回收更多的对象。具体region选择的指标根据前面的过程做出判断。

更多细节:

image-20211026214624702

可能触发的第四个过程:full GC

image-20211026214743841

G1的优化建议

image-20211026215002245

垃圾回收器的总结和比较

image-20211026215133565

一些常规的建议,不针对具体场景

image-20211026215437790

简单的给出的性能指标,作为一个简单的指导即可。

  • 没有最好的收集器,更没有万能的收集
  • 具体问题具体分析,调优永远是针对具体场景和需求。

GC日志相关查看和配置

后面有具体的实践再去细了解,这里知道有这么个东西即可。

包括一些日志中特定名词的解释,反正相信没有什么东西是没学过,简单对应下都可以知道的。

就贴两个图作为参考即可

minor GC

image-20211026220056272

Full GC

image-20211026220110234

包括还有用于日志分析的工具,都在视频中又谈到,有需要时再去进行参考。

未来新科技GC

shenandoah和ZGC。后面再去慢慢了解吧。反正时刻关注最新科技的发展即可。



这篇关于学习笔记 2021.10.26的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程