ToB企服应用市场:ToB评测及商务社交产业平台

标题: 一起了解早期使用的各种垃圾网络器 [打印本页]

作者: 惊落一身雪    时间: 2024-11-7 07:23
标题: 一起了解早期使用的各种垃圾网络器

以上是 HotSpot 虚拟机中的 7 个垃圾网络器,连线表示垃圾网络器可以配合使用。
并行网络: 指多条垃圾网络线程并行工作,但此时用户线程仍处于等候状态。
并发网络: 指用户线程与垃圾网络线程同时工作(不一定是并行的可能会交替执行)。用户步调在继承运行,而垃圾网络步调运行在另一个CPU上
吞吐量: 即CPU用于运行用户代码的时间与CPU总斲丧时间的比值(吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾网络时间 )),也就是。例如:虚拟机共运行100分钟,垃圾网络器花掉1分钟,那么吞吐量就是99%
串行Serial / Serial Old 网络器

特点:单线程、简单高效(与其他网络器的单线程相比),采用复制算法。对于限定单个CPU的环境来说,Serial网络器由于没有线程交互的开销,专心做垃圾网络天然可以获得最高的单线程网络效率。网络器举行垃圾回收时,必须暂停其他所有的工作线程,直到它竣事(Stop The World)参数:-XX:+UseSerialGC  -XX:+UseSerialOldGC

安全点: 让其他线程都在这个点停下来,以免垃圾回收时移动对象地址,使得其他线程找不到被移动的对象因为是串行的,所以只有一个垃圾回收线程。且在该线程执行回收工作时,其他线程进入阻塞状态
Serial Old是Serial网络器的老年代版本:采用标志整理算法
特点:
ParNew 网络器

年轻代:-XX:+UserParNewGC 老年代搭配 CMS
ParNew网络器其实就是Serial网络器的多线程版本

CMS 网络器

老年代:-XX:+UserConcMarkSweepGC年轻代搭配ParNew
Concurrent Mark Sweep,一种以获取最短回收停顿时间为目标的老年代网络器

运行过程分分为下列4步:
例如:Math math = new Math();此时new Math()即为math的直接引用对象,再往下为间接引用不做记录,例如构造方法中引用了其他成员变量
在整个过程中耗时最长的并发标志和并发扫除过程中,网络器线程都可以与用户线程一起工作,不必要举行停顿。
三色标志算法

三色标志
三色标志算法的问题场景:当业务线程做了对象引用变更,会发生B对象不会被扫描,当成垃圾回收。
  1. public class Demo3 {
  2.     public static void main(String[] args) {
  3.         R r = new R();
  4.         r.a = new A();
  5.         B b = new B();
  6.         // GCroot遍历R, R为黑色, R下面的a引用链还未扫完置灰灰色,R.b无引用, 切换时间分片
  7.         r.a.b = b;
  8.         // 业务线程发生了引用改变, 原本r.a.b的引用置为null
  9.         r.a.b = null;
  10.         // GC线程回来继续上次扫描,发现r.a.b无引用,则认为b对象无任何引用清除
  11.         r.b = b;
  12.         // GC 回收了b, 业务线程无法使用b
  13.     }
  14. }
  15. class R {
  16.     A a;
  17.     B b;
  18. }
  19. class A {
  20.     B b;
  21. }
  22. class B {
  23. }
复制代码

当GC线程标志A时,CPU时间片切换,业务线程举行了对象引用改变,这时候时间片回到了GC线程,继承扫描对象A, 发现A没有任何引用,则会将A赋值玄色扫描完毕,如许B则不会被扫描,会标志B是垃圾, 在清算阶段将B回收掉,错误的回收正常的对象,发生业务异常。
CMS基于这种错误标志的解决方案是接纳写屏蔽 + 增量更新Incremental Update , 在业务线程发生对象变化时,重新将R标识为灰色,重新扫描一遍,Incremental Update 在特别场景下还是会产生漏标。即当玄色对象被新增一个白色对象的引用的时候,记录下发生引用变更的玄色对象,并将它重新改变为灰色对象,重新标志。
  1. public class Demo3 {
  2.     public static void main(String[] args) {
  3.         // Incremental Update还会产生的问题
  4.         R r = new R();
  5.         A a = new A();
  6.         A b = new A();
  7.         r.a1 = a;
  8.         // GC线程切换, r扫完a1, 但是没有扫完a2, 还是灰色
  9.         r.a2 = b;
  10.         // 业务线程发生引用切换, r置灰灰色(本身灰色)
  11.         r.a1 = b;
  12.         // GC线程继续扫完a2, R为黑色, b对象又漏了~
  13.     }
  14. }
  15. class R {
  16.     A a1;
  17.     A a2;
  18. }
  19. class A {
  20. }
复制代码
当GC 1线程正在标志O, 已经标志完O的属性 O.1, 准备标志O.2时,业务线程把属性O,1 = B,这时候将O对象再次标志成灰色, GC 1线程切回,将O.2线程标志完成,这时候认为O已经全部标志完成,O标志为玄色, B对象产生了漏标, CMS针对Incremental Update产生的问题,只能在remark阶段,暂停所有线程,将这些发生过引用改变过的,重新扫描一遍。
吞吐量优先Parallel


Parallel Scavenge 网络器

新生代网络器,基于复制算法实现的网络器。特点是吞吐量优先,故也称为吞吐量优先网络器,能够并行网络的多线程网络器,允许多个垃圾回收线程同时运行,降低垃圾网络时间,提高吞吐量。 Parallel Scavenge 网络器关注点是吞吐量,高效率的使用 CPU 资源。 CMS 垃圾网络器关注点更多的是用户线程的停顿时间。
Parallel Scavenge 网络器提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾网络停顿时间的
-XX:MaxGCPauseMillis 参数以及直接设置吞吐量巨细的-XX:GCTimeRatio 参数。
该网络器的目标是达到一个可控制的吞吐量。还有一个值得关注的点是:GC自顺应调节策略(与ParNew网络器最重要的一个区别)
GC自顺应调节策略: Parallel Scavenge网络器可设置-XX:+UseAdptiveSizePolicy参数。当开关打开时不必要手动指定新生代的巨细(-Xmn)、Eden与Survivor区的比例(-XX:SurvivorRation)、晋升老年代的对象年龄(-XXretenureSizeThreshold)等,虚拟时机根据系统的运行状况网络性能监控信息,动态设置这些参数以提供最优的停顿时间和最高的吞吐量,这种调节方式称为GC的自顺应调节策略。

Parallel Old 网络器

是Parallel Scavenge网络器的老年代版本
特点:多线程,采用标志整理算法(老年代没有幸存区)
面试题专栏

Java面试题专栏已上线,欢迎访问。
那么可以私信我,我会尽我所能资助你。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4