Java12&13新特性 -- Shenandoah GC

Shenandoah 垃圾回收器是 Red Hat 在 2014 年宣布进行的一项垃圾收集器研究项目 Pauseless GC 的实现,旨在针对 JVM 上的内存收回实现低停顿的需求。该设计将与应用程序线程并发,通过交换 CPU 并发周期和空间以改善停顿时间,使得垃圾回收器执行线程能够在 Java 线程运行时进行堆压缩,并且标记和整理能够同时进行,因此避免了在大多数 JVM 垃圾收集器中所遇到的问题。

Shenandoah GC 主要目标是 99.9% 的暂停小于 10ms,暂停与堆大小无关等。

垃圾回收期的分类:
  • 按线程数分,可以分为串行垃圾回收器和并行垃圾回收器。

    • 串行回收指的是在同一时间段内只允许一件事情发生,简单来说,当多个CPU 可用时,也只能有一个CPU
      用于执行垃圾回收操作,井且在执行垃圾回收时,程序中的工作线程将会被暂停,当垃圾收集工作完成后
      才会恢复之前被暂停的工作线程,这就是串行回收。
    • 和串行回收相反,并行收集可以运用多个CPU 同时执行垃圾回收,因此提升了应用的吞吐量,不过并行回
      收仍然与串行回收一样,采用独占式,使用了“ Stop-the-world ”机制和复制算法。
  • 按照工作模式分,可以分为并发式回收器和独占式垃圾回收器。
    • 并发式垃圾回收器与应用程序线程交替工作,以尽可能减少应用程序的停顿时间。
    • 独占式垃圾回收器( Stop the world)一旦运行,就停止应用程序中的其他所有线程,直到垃圾回收过程完
      全结束。
  • 按碎片处理方式可分为压缩式垃圾回收器和非压缩式垃圾回收器。
    • 压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收后的碎片。
    • 非压缩式的垃圾回收器不进行这步操作。
  • 按工作的内存区间,又可分为年轻代垃圾回收器老年代垃圾回收器
如何评估一款GC的性能
  • 吞吐量:程序的运行时间(程序的运行时间+内存回收的时间)。
  • 垃圾收集开销:吞吐量的补数,垃圾收集器所占时间与总时间的比例。
  • 暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间。
  • 收集频率:相对于应用程序的执行,收集操作发生的频率。
  • 堆空间: Java 堆区所占的内存大小。
  • 快速: 一个对象从诞生到被回收所经历的时间。
Shenandoah GC工作原理:

其内存结构与 G1 非常相似,都是将内存划分为类似棋盘的region。整体流程与 G1 也是比较相似的,最大的区别在于实现了并发的 疏散(Evacuation) 环节,引入的 BrooksForwarding Pointer 技术使得 GC 在移动对象时,对象引用仍然可以访问。

Init Mark 启动并发标记阶段:

  1. 并发标记遍历堆阶段
  2. 并发标记完成阶段
  3. 并发整理回收无活动区域阶段
  4. 并发 Evacuation 整理内存区域阶段
  5. Init Update Refs 更新引用初始化 阶段
  6. 并发更新引用阶段
  7. Final Update Refs 完成引用更新阶段
  8. 并发回收无引用区域阶段
配置或调试 Shenandoah 的 JVM 参数:
  1. -XX:+AlwaysPreTouch:使用所有可用的内存分页,减少系统运行停顿,为避免运行时性能损失。
  2. -Xmx == -Xmsv:设置初始堆大小与最大值一致,可以减轻伸缩堆大小带来的压力,与 AlwaysPreTouch 参数配合使用,在启动时提交所有内存,避免在最终使用中出现系统停顿。
  3. -XX:+ UseTransparentHugePages:能够大大提高大堆的性能,同时建议在 Linux 上使用时将
    /sys/kernel/mm/transparent_hugepage/enabled 和/sys/kernel/mm/transparent_hugepage/defragv 设置为:madvise,同时与 AlwaysPreTouch 一起使用时,init 和 shutdownv 速度会更快,因为它将使用更大的页面进行预处理。
  4. -XX:+UseNUMA:虽然 Shenandoah 尚未明确支持 NUMA(Non-Uniform Memory Access),但最好启用此功
    能以在多插槽主机上启用 NUMA 交错。与 AlwaysPreTouch 相结合,它提供了比默认配置更好的性能。
  5. -XX:+DisableExplicitGC:忽略代码中的 System.gc() 调用。当用户在代码中调用 System.gc() 时会强制
    Shenandoah 执行 STW Full GC ,应禁用它以防止执行此操作,另外还可以使用 -
  6. XX:+ExplicitGCInvokesConcurrent,在 调用 System.gc() 时执行 CMS GC 而不是 Full GC,建议在有
    System.gc() 调用的情况下使用。
    不过目前 Shenandoah 垃圾回收器还被标记为实验项目,如果要使用Shenandoah GC需要编译时--with-jvmfeatures选项带有shenandoahgc,然后启动时使用参数
  7. -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC

原文地址:https://www.cnblogs.com/androidsuperman/p/11704968.html

时间: 2024-07-30 23:07:05

Java12&13新特性 -- Shenandoah GC的相关文章

Java12可用新特性一览,了解一下没有错

你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough 现陆续将Demo代码和技术文章整理在一起 Github实践精选,本文同样收录在此,方便大家阅读查看,觉得不错,还请Star?? 日常工作对集合操作真的太频繁了,前端时间就写过一篇关于Java 12 集合的文章 Java12 Collectors.teeing 的使用详解 , 有朋友留言说这个功能比

Docker 1.13 新特性 —— Docker服务编排相关

摘要: 近期发布的1.13的版本中,Docker对Docker Engine内置的编排能力做了很多的更新,使用新的这些特性,我们能更好的编排和迭代我们的应用. 我们都知道在去年Docker轰动容器社区的在Docker Engine中集成了编排能力,并随着1.12的Docker版本发布,但是那个版本的编排还有很多的不足,比如: 不兼容传统的Docker Compose格式,从Compose迁移到服务复杂. 不支持复杂的服务发布方式和回滚等 而在近期发布的1.13的版本中,Docker对Docker

Java12新特性 -- 默认生成类数据共享(CDS)归档文件

默认生成类数据共享(CDS)归档文件 同一个物理机/虚拟机上启动多个JVM时,如果每个虚拟机都单独装载自己需要的所有类,启动成本和内 存占用是比较高的.所以Java团队引入了类数据共享机制 (Class Data Sharing ,简称 CDS) 的概念,通过把一些核心类在每个JVM间共享,每个JVM只需要装载自己的应用类即可.好处是:启动时间减少了,另外核心类是共享的,所以JVM的内存占用也减少了. 历史版本 JDK5引入了Class-Data Sharing可以用于多个JVM共享class,

Java新特性 5、6、7、8、9、10、11、12、13

项目地址:https://github.com/hepengju/java-new-features项目目标:1. 列举Java5-13版本的关键新特性2. 对每个新特性进行全面的阐述与代码示例 原文地址:https://www.cnblogs.com/hepengju/p/11595102.html

Java12新特性 -- switch表达式

传统switch表达式的弊端: 匹配是自上而下的,如果忘记写break, 后面的case语句不论匹配与否都会执行: 所有的case语句共用一个块范围,在不同的case语句定义的变量名不能重复: 不能在一个case里写多个执行结果一致的条件: 整个switch不能作为表达式返回值: java 12 switch新特性: 使用 Java 12 中 Switch 表达式的写法,省去了 break 语句,避免了因少写 break 而出错. 同时将多个 case 合并到一行,显得简洁.清晰也更加优雅的表达

Atitit. C#.net clr 2.0  4.0新特性

Atitit. C#.net clr 2.0  4.0新特性 1. CLR内部结构1 2. CLR 版本发展史3 3. CLR 2.0 3 4. CLR 4 新特性 概览4 4.1.1.  托管与本地代码的互操作5 4.1.2.    垃圾回收6 4.1.3.    代码约定6 4.1.4.    Corrupted state exception6 4.1.5.     新的安全模型7 4.1.6.     同一个进程,多个CLR7 4.1.7.     基本类库7 5. CLR最新发展8 6

Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27

Atitit.编程语言新特性 通过类库框架模式增强 提升草案 v3 q27 1. 修改历史2 2. 适用语言::几乎所有编程语言.语言提升的三个渠道::语法,类库,框架,ide2 2.1. 单根继承 vs  多跟继承3 2.2. 默认参数3 2.3. 等号判断相等,儿不是equ3 2.4. 隐式类型,类型推导3 2.5. 匿名类型3 2.6. 初始化器  对象初始化器 与 集合初始化器 { }4 2.7. 委托4 2.8. 内置委托 Func / Action 4 2.9. 标准查询运算符 St

PHP5.3, PHP5.4, PHP5.5新特性

因为用到PHP新版本,一些新特性必须要了解,且有些可以在开发时就使用,如果不使用,那么何必升级PHP版本呢,显得有些得不偿失了! 所以整理了一下 一些特性,有可能不全,待添加 PHP 5.3中的新特性 一.PHP 5.3中的新特性 1. 支持命名空间 (Namespace) 2. 支持延迟静态绑定(Late Static Binding) 3. 支持goto语句 4. 支持闭包.Lambda/Anonymous函数 5. 新增两个魔术方法__callStatic()和__invoke() 6.

php 各个版本的新特性

因为用到PHP新版本,一些新特性必须要了解,且有些可以在开发时就使用,如果不使用,那么何必升级PHP版本呢,显得有些得不偿失了!所以整理了一下 一些特性,有可能不全,待添加PHP 5.3中的新特性一.PHP 5.3中的新特性1. 支持命名空间 (Namespace)2. 支持延迟静态绑定(Late Static Binding)3. 支持goto语句4. 支持闭包.Lambda/Anonymous函数5. 新增两个魔术方法__callStatic()和__invoke()6. 新增Nowdoc语