南通专业网站制作,wordpress怎样在列表页使用瀑布流,成都网站建设蜀美网络,wordpress shortcode插件JVM 4.1 哪些对象可以作为GC ROOT?
虚拟机栈#xff08;栈帧中的局部变量表#xff09;中引用的对象本地方法栈中引用的对象方法区静态变量引用的对象方法区常量引用的对象被同步锁持有的对象JNI#xff08;Java Native Interface#xff09;引用的对象
4.2 常用垃圾收集…JVM 4.1 哪些对象可以作为GC ROOT?
虚拟机栈栈帧中的局部变量表中引用的对象本地方法栈中引用的对象方法区静态变量引用的对象方法区常量引用的对象被同步锁持有的对象JNIJava Native Interface引用的对象
4.2 常用垃圾收集器
1、Serial 收集器 单线程收集器 收集时暂停用户线程Stop the World 简单高效与其他收集器的单线程相比
新生代老年代标记-复制标记-整理 2、ParNew收集器 Serial多线程版本 收集时暂停用户线程Stop the World 除了 Serial 收集器外只有它能与 CMS 收集器真正意义上的并发收集器后面会介绍到配合工作
新生代老年代标记-复制标记-整理 3、Parallel Scavenge收集器
类似ParNew不过可以指定老年代使用串行还是并行收集
-XX:UseParallelGC使用 Parallel 收集器 老年代串行-XX:UseParallelOldGC使用 Parallel 收集器 老年代并行关注吞吐量CMS关注用户体验 收集时暂停用户线程Stop the World JDK8默认收集器 JDK1.8 默认使用的是 Parallel Scavenge Parallel Old如果指定了-XX:UseParallelGC 参数则默认指定了-XX:UseParallelOldGC可以使用-XX:-UseParallelOldGC 来禁用该功能
新生代老年代标记-复制标记-整理 4、Serial Old收集器
Serial 老年代版本单线程。收集时暂停用户线程Stop the World用于在Jdk1.5以上和Paraller Old搭配使用或者作为CMS收集器的备选方案
新生代老年代标记-复制标记-整理 5、Paraller Old收集器
Parallel Scavenge老年代版本注重吞吐量收集时暂停用户线程Stop the World
6、CMSConcurrent Mark Sweep收集器
是一种以获取最短回收停顿时间为目标的收集器注重用户体验HotSpot第一款真正意义上的并发收集器第一次实现让垃圾线程和用户线程同时工作 收集方式 标记-清除
收集流程
初始标记暂停所有其他线程记录直接与root连接的对象速度很快并发标记同时开启GC和用户线程使用一个闭包结构去记录可达对象。但是在这个阶段结束后这个闭包结构并不能保证当前所有对象可达因为用户线程会不断的更新引用域所以GC线程无法保证可达性分析的实时性。这个算法作用就是跟踪记录这些发生引用更新的地方。重新标记作用是修正并发标记时因为用户程序而导致标记变更的那一部分对象的标记记录这个阶段的停顿时间比初始标记时间长但是远远比并发标记时间短。并发清除开启用户线程后同时GC线程开始对未标记的区域做清扫。 优点
并发收集停顿低用户线程友好
缺点
对CPU资源敏感无法处理浮动垃圾使用的标记-清除算法会导致收集结束时有大量空间碎片 JDK9开始CMS已被弃用
7、G1收集器
面向服务器的垃圾收集器极高概率满足GC停顿时间和吞吐量有要求并行与并发可以充分利用CPU、多核环境下的硬件优势使用多个CPUCPU或者核心来缩短stop-the-world停顿时间。部分其他收集器原本需要停顿Java线程执行GC但是G1仍然可以通过并发的方式让Java程序继续执行分代收集不需要和其他收集器配合自己使用分代收集空间整合整体可以看做是基于“标记-整理”算法实现的收集器从局部看是基于“标记-复制”算法实现的。可预测的停顿G1的一个大优势G1除了追求低停顿外还能建立可预测的时间模型能让使用者明确指定在一个长度为 M 毫秒的时间片段内消耗在垃圾收集上的时间不得超过 N 毫秒。
收集流程
初始标记并发标记最终标记筛选回收 G1 收集器在后台维护了一个优先列表每次根据允许的收集时间优先选择回收价值最大的 Region(这也就是它的名字 Garbage-First 的由来) 。这种使用 Region 划分内存空间以及有优先级的区域回收方式保证了 G1 收集器在有限时间内可以尽可能高的收集效率把内存化整为零。
从 JDK9 开始G1 垃圾收集器成为了默认的垃圾收集器。
8、ZGC 收集器
与 CMS 中的 ParNew 和 G1 类似ZGC 也采用标记-复制算法不过 ZGC 对该算法做了重大改进。
ZGC 可以将暂停时间控制在几毫秒以内且暂停时间不受堆内存大小的影响出现 Stop The World 的情况会更少但代价是牺牲了一些吞吐量。ZGC 最大支持 16TB 的堆内存。
ZGC 在 Java11 中引入处于试验阶段。经过多个版本的迭代不断的完善和修复问题ZGC 在 Java15 已经可以正式使用了。 不过默认的垃圾回收器依然是 G1。你可以通过下面的参数启用 ZGC
java -XX:UseZGC className在 Java21 中引入了分代 ZGC暂停时间可以缩短到1毫秒以内。
你可以通过下面的参数启用分代 ZGC
java -XX:UseZGC -XX:ZGenerational className4.3各个收集器之间的关系 各个垃圾收集器可以配合使用
文章参考地址