JVM篇:垃圾回收器

串行垃圾回收器

单线程实现垃圾回收,适合堆内存比较小的场景,如个人电脑

吞吐量优先

多线程实现,适合堆内存比较大的场景(服务器)

优点:让单位时间内,垃圾回收的时间尽可能短(比如一个小时内进行了2次垃圾回收,一次回收需要0.2秒,那么一共需要0.4秒,单位时间内垃圾回收时间在总运行的时间的占比叫吞吐量,占比越低,吞吐量越高)

CMS垃圾回收器

多线程实现,适合堆内存比较大的场景(服务器)

优点:尽可能的让单次垃圾回收时间短(在一个小时内,进行了五次垃圾回收,但是每次回收时间都是0.1秒,那么一个小时内,垃圾回收总时间就是0.5秒)

缺点:由于采用的是标记清除的算法,因此会产生内存碎片,当新的对象无法添加时,会进行串行清除,这会导致清理时间过长。

  • 初始标记:主要是标记GC Roots的直接引用对象
  • 并发标记:遍历初始标记中标记的对象,标记存活对象
  • 重新标记:矫正并发标记,如果在并发标记中其他用户线程创建了新的对象不需要回收,对其进行标记
  • 并发清理:对没有标记的对象进行回收。

G1垃圾回收器

G1垃圾回收器在JDK9之后取代了CMS回收器。G1回收器更注重吞吐量与低延迟,默认的最大暂停时间为200ms。适合超大堆内存使用,会将堆内存划分多个大小相等的(1M、2M、4M、8M等)Region,每个Region都可以充当伊甸园,幸存区与老年代角色。整体采用标记整理算法,区域之间采用复制算法。

相关的JVM参数

-XX:+UseG1GC 使用G1垃圾回收器

-XX:G1HeapRegionsize=size 设置Region大小

-XX:MaxGCPauseMillis=time 设置最大暂停时间

G1的三种垃圾回收阶段

Young Collection新生代收集阶段

此阶段会产生STW的结果

Young Collection +CM新生代收集+并发标记阶段

在Young GC时会对其进行GC Roots的初始标记。

老年代区域占堆内存比例超过阈值时,会对其进行并发标记。默认为45%,修改阈值的JVM参数为:

-XX:InitiatingHeapOccupancyPercent=percent

Mixed Collection混合收集阶段

会对伊甸园,幸存区以及老年代进行全面垃圾回收,在老年代垃圾回收时为了满足JVM中的最大GC暂停时间参数来决定具体回收哪些区域的老年代(优先选择回收过后释放的内存空间最大的区域),在这个阶段会STW。

相关推荐
银河系的一束光4 分钟前
使用 IntelliJ IDEA 开发 Java 程序时 , 会遇到以下中文乱码问题 :
java·ide·intellij-idea
QQ676580089 分钟前
基于yolo26算法的水下目标检测图像数据集 海洋生物识别 海胆识别 海龟识别数据集 海洋生物监测与保护工作 潜水作业安全辅助系 水下环境感知第10408期
算法·目标检测·水下目标检测·海洋生物识别·海胆 海龟识别·海洋生物监测与保护工作·潜水作业安全辅助 水下环境感知
Via_Neo11 分钟前
判断字符串前缀(26年蓝桥杯JAVA B组)
java·职场和发展·蓝桥杯
XiYang-DING18 分钟前
【Java】从源码深入理解HashMap和TreeMap
java·开发语言
七颗糖很甜22 分钟前
基于 OpenCV 的 FY2 云顶图云块追踪算法实现
人工智能·opencv·算法
__Wedream__23 分钟前
NTIRE 2026 Challenge on Efficient Super-Resolution——冠军方案解读
人工智能·深度学习·算法·计算机视觉·超分辨率重建
FL162386312927 分钟前
基于深度学习mediape实现人员跌倒人体姿势跌倒检测算法源码+说明文件
人工智能·深度学习·算法
wangwangmoon_light28 分钟前
1.23 LeetCode总结(树)_一般树
算法·leetcode·职场和发展
若水不如远方28 分钟前
一文讲透单点登录原理(SSO):从同域共享到跨域票据
java·后端
不懂的浪漫28 分钟前
mqtt-plus 架构解析(七):动态订阅与重连恢复,为什么能走同一条协调路径
java·物联网·mqtt·架构