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.pswp.cn/web/39420.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/39420.shtml
英文地址,請注明出處:http://en.pswp.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;…