Shenandoah GC概述

文章目录

    • 1_介绍
    • 2_原理
      • 1.0版本
      • 2.0版本
      • 3_ShenandoahGC的执行流程
      • 4_并发转移阶段 – 并发问题

1_介绍

Shenandoah 是由Red Hat开发的一款低延迟的垃圾收集器,Shenandoah 并发执行大部分 GC 工作,包括并发的整理,堆大小对STW的时间基本没有影响。

在这里插入图片描述

1、下载。Shenandoah只包含在OpenJDK中,默认不包含在内需要单独构建,可以直接下载构建好的。
下载地址:https://builds.shipilev.net/openjdk-jdk-shenandoah/

选择方式如下:
{aarch64, arm32-hflt, mipsel, mips64el, ppc64le, s390x, x86_32, x86_64}:架构,使用arch命令选择对应的的架构。
{server,zero}:虚拟机类型,选择server,包含所有GC的功能。
{release, fastdebug, Slowdebug, optimization}:不同的优化级别,选择release,性能最高。
{gcc*-glibc*, msvc*}:编译器的版本,选择较高的版本性能好一些,如果兼容性有问题(无法启动),选择较低的版本。

在这里插入图片描述

2、配置。将OpenJDK配置到环境变量中,使用java –version进行测试。打印出如下内容代表成功。

在这里插入图片描述

3、添加参数,运行Java程序。

  • -XX:+UseShenandoahGC 开启Shenandoah GC
  • -Xlog:gc 打印GC日志

在这里插入图片描述

/** Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved.* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.** This code is free software; you can redistribute it and/or modify it* under the terms of the GNU General Public License version 2 only, as* published by the Free Software Foundation.  Oracle designates this* particular file as subject to the "Classpath" exception as provided* by Oracle in the LICENSE file that accompanied this code.** This code is distributed in the hope that it will be useful, but WITHOUT* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or* FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License* version 2 for more details (a copy is included in the LICENSE file that* accompanied this code).** You should have received a copy of the GNU General Public License version* 2 along with this work; if not, write to the Free Software Foundation,* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.** Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA* or visit www.oracle.com if you need additional information or have any* questions.*/package org.sample;import com.sun.management.OperatingSystemMXBean;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;//执行5轮预热,每次持续2秒
@Warmup(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
//输出毫秒单位
@OutputTimeUnit(TimeUnit.MILLISECONDS)
//统计方法执行的平均耗时
@BenchmarkMode(Mode.AverageTime)
//java -jar benchmarks.jar -rf json
@State(Scope.Benchmark)
public class MyBenchmark {//每次测试对象大小 4KB和4MB@Param({"4","4096"})int perSize;private void test(Blackhole blackhole){//每次循环创建堆内存60%对象 JMX获取到Java运行中的实时数据MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();//获取堆内存大小MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();//获取到剩余的堆内存大小long heapSize = (long) ((heapMemoryUsage.getMax() - heapMemoryUsage.getUsed()) * 0.6);//计算循环次数long size = heapSize / (1024 * perSize);for (int i = 0; i < 4; i++) {List<byte[]> objects = new ArrayList<>((int)size);for (int j = 0; j < size; j++) {objects.add(new byte[1024 * perSize]);}blackhole.consume(objects);}}@Benchmark@Fork(value = 1,jvmArgsAppend = {"-Xms4g","-Xmx4g","-XX:+UseSerialGC"})public void serialGC(Blackhole blackhole){test(blackhole);}@Benchmark@Fork(value = 1,jvmArgsAppend = {"-Xms4g","-Xmx4g","-XX:+UseParallelGC"})public void parallelGC(Blackhole blackhole){test(blackhole);}@Benchmark@Fork(value = 1,jvmArgsAppend = {"-Xms4g","-Xmx4g"})public void g1(Blackhole blackhole){test(blackhole);}@Benchmark@Fork(value = 1,jvmArgsAppend = {"-Xms4g","-Xmx4g","-XX:+UseShenandoahGC"})public void shenandoahGC(Blackhole blackhole){test(blackhole);}public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(MyBenchmark.class.getSimpleName()).forks(1).build();new Runner(opt).run();}
}

测试结果:

在这里插入图片描述

Shenandoah GC对小对象的GC停顿很短,但是大对象效果不佳。

更多调优策略详见:https://wiki.openjdk.org/display/shenandoah/Main。

2_原理

1.0版本

在这里插入图片描述

如果转移阶段未完成,此时转移前的对象和转移后的对象都会存活。如果用户去访问数据,需要使用转移后的数据。 ShenandoahGC使用了读前屏障,根据对象的前向指针来获取到转移后的对象并读取。

在这里插入图片描述

写入数据时会使用写前屏障,判断Mark Word中的GC状态,如果GC状态为0证明没有处于GC过程中,直接写入,如果不为0则根据GC状态值确认当前处于垃圾回收的哪个阶段,让用户线程执行垃圾回收相关的任务。

在这里插入图片描述

1.0版本的缺点:
1、对象内存大大增加,每个对象都需要增加8个字节的前向指针,基本上会占用5% - 10%的空间。
2、读屏障中加入了复杂的指令,影响使用效率。

2.0版本

2.0版本优化了前向指针的位置,仅转移阶段将其放入了Mark Word中。

在这里插入图片描述

3_ShenandoahGC的执行流程

在这里插入图片描述

4_并发转移阶段 – 并发问题

如果用户线程在帮忙转移时,ShenandoahGC线程也发现这个对象需要复制,那么就会去尝试写入前向指针,使用了类似CAS的方式来实现,只有一个线程能成功修改,其他线程会放弃转移的操作。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/39420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

if __name__ == “__main__“

在Python中&#xff0c;if __name__ "__main__": 这行代码非常常见&#xff0c;它用于判断当前运行的脚本是否是主程序。这里的 __name__ 是一个特殊变量&#xff0c;当Python文件被直接运行时&#xff0c;__name__ 被自动设置为字符串 "__main__"。但是&…

【pearcmd】通过pearcmd.php 进行GetShell

https://cloud.tencent.com/developer/article/2204400 关于PHP 配置 register_argc_argv 小结 的一些研究文章。 应用例题 [NewStarCTF 2023 公开赛道]Include &#x1f350; <?phperror_reporting(0);if(isset($_GET[file])) {$file $_GET[file];if(preg_match(/flag|l…

如何理解synchronized锁升级

在Java中&#xff0c;synchronized 关键字是实现线程同步的一种方式&#xff0c;它涉及到锁的升级和释放的过程。理解synchronized 锁的升级可以分为三个阶段&#xff1a;无锁状态、偏向锁状态和轻量级锁状态。 无锁状态&#xff1a; 当对象被创建时&#xff0c;默认处于无锁状…

贪心 | Java | LeetCode 455, 376, 53 做题总结

贪心算法介绍 贪心算法&#xff1a;贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 说实话贪心算法并没有固定的套路。 一般解题步骤 贪心算法一般分为如下四步&#xff1a; ① 将问题分解为若干个子问题 ② 找出适合的贪心策略 ③ 求解每一个子问题的…

SQL Server数据库的组成

《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;》图书介绍-CSDN博客 对于数据库的概念&#xff0c;没有一个完全固定的定义&#xff0c;随着数据库历史的发展&#xff0c;定义的内容也有很大的差异&#xff0c;其中一种比较普遍的观点认为&#xff0c;…

Java中的并行计算与任务分发策略

Java中的并行计算与任务分发策略 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 并行计算的重要性与挑战 在当今软件开发领域&#xff0c;随着数据量和计算复…

c++获取路径中的文件名

C获取路径中的文件名有狠多方法&#xff0c;最常见的方法&#xff1a; 使用C标准库 首先&#xff0c;可以使用C标准库中的字符串处理函数来获取路径中的文件名。可以通过以下步骤实现&#xff1a; 使用字符串分割函数&#xff08;例如std::string::find_last_of、std::string…

Winform中使用HttpClient实现调用http的post接口并设置传参content-type为application/json示例

场景 Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类&#xff1a; Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类_winform解析json-CSDN博客 上面使用HttpClient调用post接口时使用的HttpCon…

21.《C语言》——【位操作符】

&#x1f33b;开场语 亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&a…

今天不看文章,明天变垃圾(明天收费)-----字节数据分析发展过程中所遭遇的挑战

字节数据分析发展过程中所遭遇的挑战 三个核心议题&#xff1a; 海量数据分析性能&#xff1a;会议指出Spark分析性能不足成为了一个显著问题&#xff0c;尤其是在需要毫秒级响应的业务场景中。实时导入与查询能力&#xff1a;目前Kylin只能以T1的形式提供分析服务&#xff0…

蓝牙资讯|苹果Apple Pencil新专利:用笔套扩展传感器 / 续航等模块化方案

根据美国商标和专利局最新公示的清单&#xff0c;苹果公司获得了一项 Apple Pencil 的专利&#xff0c;探索了模块化设计方案&#xff0c;用户未来可以根据自身需求或者使用场景&#xff0c;随心更换 Pencil 的模块&#xff0c;达到不同的效果。 苹果在专利中表示笔套内置传感器…

Docker实战教程(一)

文章目录 Docker实战教程一、Docker简介二、Docker安装过程1. Windows上安装Docker2. Linux上安装Docker三、Docker基本概念四、Docker常用命令五、Docker常见应用场景六、总结Docker实战教程 Docker是一种开源的容器化平台,能够自动化应用程序的部署、管理和隔离。它使得开发…

jQuery UI 简介

jQuery UI 简介 1. 引言 jQuery UI 是一个建立在 jQuery JavaScript 库之上的开源小部件和交互库,旨在创建高度交互的网页。它提供了一系列预先设计好的小部件,如拖放、排序、对话框、工具提示等,以及用于构建复杂用户界面的交互方法。jQuery UI 的设计目标是简化 HTML 文…

图书电商引入实在Agent:自动化运营提效80%,节省人天1000+

某知名教辅图书品牌深耕中小学教辅图书领域&#xff0c;是中国最具影响力的教育出版策划与发行集团之一&#xff0c;以丰富的图书品类&#xff0c;满足了小学、初中、高中各年龄段读者多元化的阅读需求。 2023年&#xff0c;该品牌在运营、客服等多部门超60个场景中部署实在Ag…

2024高考作文题“人工智能”

今年开年到现在&#xff0c;明显的感受就是&#xff0c;咨询人工智能机器人的客户比往年更多了。什么原因&#xff0c;是因为人工成本太高了&#xff0c;今年整体经济环境变差&#xff0c;招不起人&#xff0c;所以想用AI机器人来降低用工成本吗&#xff1f; 还是说因为语音线路…

嵌入式Linux:ARM体系简介

目录 1. 体系结构 2. 指令集 3. 工作状态 4. 工作模式 5. 寄存器 6. 异常与中断 其他 DOS命令 Linux 命令 1. 体系结构 冯-诺依曼体系结构是把数据与指令都 存放在同一存储区域,取数据与取指令利用同一数据总线,结构简单,但速度较慢,取址不能同时取数据。 哈弗结构…

项目进度管理(信息系统项目管理师)

定义活动的输出&#xff1a;活动清单、活动属性、里程碑清单定义活动的输入包括进度管理计划、范围基准、事业环境因素、组织过程资产定义活动的工具与技术包括专家判断、分解、滚动式规划、会议分解是一种把项目范围和项目可交付成果逐步划分为更小、更便于管理的组成部分的技…

鸿蒙开发过程遇到的坑

LazyForEach键值设置应该为 (item: FreelyPurchaseProductDataModel) > JSON.stringify(item) 否则列表修改了数量不会刷新

银湖资本在中国设立公司运营点,全球投资巨头的新篇章!

近日&#xff0c;全球知名私募股权投资公司银湖资本宣布在中国设立公司运营点。一点是银湖资本在国内安置了两个办事营业点&#xff0c;一个在黑龙江&#xff0c;一个在广州等一线城市。这一举动标志着银湖资本在全球范围内的扩展进入了新的阶段&#xff0c;同时也展示了其对中…

SerialportToTcp①

窗体 效果&#xff1a;串口和网口旁边的是panel当客户端或者服务器发送消息的时候会闪烁&#xff0c;下面的的textbox当接收到接受或者发送的数据会增加数量&#xff0c;心跳机制单选框可以开关&#xff0c;可设置心跳间隔和内容&#xff0c;重置按钮重置串口数据&#xff0c;…