日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

解決GC毛刺問題——轉(zhuǎn)轉(zhuǎn)搜索推薦服務JDK17升級實踐

來源: 責編: 時間:2023-09-28 10:07:18 371觀看
導讀1 升級背景隨著轉(zhuǎn)轉(zhuǎn)業(yè)務規(guī)模的不斷增長,我們的搜索推薦服務正在面臨嚴峻的垃圾回收(Garbage Colletion, GC)帶來的服務接口耗時毛刺問題。我們當前所使用的JDK1.8版本中的CMS和G1收集器,在應對請求高峰時均不理想,經(jīng)常出現(xiàn)

1 升級背景

隨著轉(zhuǎn)轉(zhuǎn)業(yè)務規(guī)模的不斷增長,我們的搜索推薦服務正在面臨嚴峻的垃圾回收(Garbage Colletion, GC)帶來的服務接口耗時毛刺問題。41t28資訊網(wǎng)——每日最新資訊28at.com

我們當前所使用的JDK1.8版本中的CMS和G1收集器,在應對請求高峰時均不理想,經(jīng)常出現(xiàn)的停頓問題直接影響了服務的可用性及用戶體驗。41t28資訊網(wǎng)——每日最新資訊28at.com

我們面臨的核心挑戰(zhàn)是:41t28資訊網(wǎng)——每日最新資訊28at.com

  • 服務請求流量激增時,GC次數(shù)頻繁是我們的一大痛點,每分鐘有可能達到十幾次以上。另一方面,單次GC停頓時間也較長,可高達數(shù)十毫秒。這不但降低了服務的可用性,也限制了服務的吞吐量,對于我們的在線服務是難以接受的。
  • 同時GC參數(shù)的調(diào)優(yōu)工作遇到瓶頸,盡管還可以通過減少新對象創(chuàng)建速率等方式繼續(xù)優(yōu)化,但整體投入產(chǎn)出比偏低。

為此,我們計劃通過升級JDK版本來實現(xiàn)GC問題的改善。JDK新版本帶來了如ZGC、Shenandoah等新一代GC算法,它們能夠提供極低的GC停頓時間,有望解決我們的在線服務目前的GC毛刺問題。41t28資訊網(wǎng)——每日最新資訊28at.com

我們的升級目標是利用新版本JDK中的新GC算法,將搜索推薦服務的GC停頓時間降低90%以上,保證高流量服務的可用性和吞吐量,進一步提升用戶體驗。41t28資訊網(wǎng)——每日最新資訊28at.com

2 JDK17簡介

我們選擇將JDK版本升級到JDK17,主要原因有:41t28資訊網(wǎng)——每日最新資訊28at.com

  • 一方面,JDK17是目前最新的長期支持(Long Term Support,LTS)版本,相比其他版本,它能提供更穩(wěn)定和持久的支持,同時也有大量企業(yè)應用了JDK17,有豐富成熟的使用經(jīng)驗??梢灶A見JDK17在未來一段時間也將會是主流版本,能得到更好的社區(qū)支持。
  • 另一方面,JDK17作為新一代版本,與舊版JDK8相比,既能與現(xiàn)有代碼上保持兼容性,又在語法和GC算法等多個方面做出了重要改進和優(yōu)化。如JDK17包含了可用于生產(chǎn)環(huán)境的ZGC,且它的性能在歷代版本迭代下,得到大幅增強。

2.1 新語法簡介

具體來看,此次JDK 17的升級在語法上帶來了以下幾個值得注意的新特性:41t28資訊網(wǎng)——每日最新資訊28at.com

類型推斷41t28資訊網(wǎng)——每日最新資訊28at.com

從JDK10版本開始,引入了局部變量類型推斷(Local Variable Type Inference)功能,它可以讓我們在聲明局部變量時省略變量類型,而由編譯器根據(jù)變量初始化的值自動推斷出類型。    41t28資訊網(wǎng)——每日最新資訊28at.com

// 傳統(tǒng)變量聲明方法String str = "hello";// 使用類型推斷的變量聲明方法var str = "hello";

Stream API的增強41t28資訊網(wǎng)——每日最新資訊28at.com

JDK新版本對Stream API進行了一些增強,主要有:41t28資訊網(wǎng)——每日最新資訊28at.com

takeWhile和dropWhile會對流中每個元素逐一校驗,遇到第一個不符合條件的元素終止,takeWhile返回終止位置前面的所有元素,而dropWhile則返回包含終止位置后面的所有元素。它們功能雖然與filter類似,區(qū)別是前者并非對整個流進行校驗,可以提升過濾效率,但需要注意流內(nèi)元素的順序。41t28資訊網(wǎng)——每日最新資訊28at.com

var list = List.of(1,2,3,4,5,6);// 輸出:1,2;list.stream().takeWhile(n -> n < 3).forEach(System.out::println); // 輸出:3,4,5,6list.stream().dropWhile(n -> n < 3).forEach(System.out::println);

iterate可以生成一個無限的流,它在JDK9之前需要limit()等操作來配合終止,否則將無限遞歸下去。在JDK9中iterate新增了一個重載方法,現(xiàn)在支持使用條件來終止,它在語法上更簡潔,也提供了更多的靈活性。41t28資訊網(wǎng)——每日最新資訊28at.com

// 輸出:1,2,4,8,...,512,1024Stream.iterate(1, n -> n <= 1024, n -> n * 2).forEach(System.out::println);

集合API新增方法41t28資訊網(wǎng)——每日最新資訊28at.com

操作集合將更加方便,如可以更加簡潔的創(chuàng)建List和Map,但需要注意這種方式創(chuàng)建的集合均是不可變的。41t28資訊網(wǎng)——每日最新資訊28at.com

var list = List.of(1, 2, 3, 4, 5);var map1 = Map.of("a", 1, "b", 2);var map2 = Map.ofEntries(Map.entry("a", 1), Map.entry("b", 2));

同時新增了多種Collector方法,如可以通過groupingBy新增的重載方法實現(xiàn)多級分組,假設Product類有Cate、Brand、Model成員,則可以做如下多層分組收集:41t28資訊網(wǎng)——每日最新資訊28at.com

// 按Cate、Brand分組,收集Model列表List<Product> products = ...;Map<Cate, Map<Brand, List<Model>>> result = products.stream()  .collect(Collectors.groupingBy(Product::getCate,          Collectors.groupingBy(Product::getBrand,          Collectors.mapping(Product::getModel, Collectors.toList()))));

Swtich新語法41t28資訊網(wǎng)——每日最新資訊28at.com

JDK12開始,switch語句增加了新的語法形式,允許使用更靈活的表達式匹配,并可以返回值,提升了代碼的簡潔性。41t28資訊網(wǎng)——每日最新資訊28at.com

int month = ...;String days = switch(month) {  case 1, 3, 5, 7, 8, 10, 12 -> "31 days";  case 4, 6, 9, 11 -> "30 days";  case 2 -> "28 or 29 days";}

文本塊41t28資訊網(wǎng)——每日最新資訊28at.com

JDK13開始提供了一種新的字符串格式,用戶可以選擇用三個雙引號(""")作為字符串開頭及結(jié)尾,直接編寫多行文本,它為JSON、SQL等格式的字符串編寫提升了簡潔性和便利性。41t28資訊網(wǎng)——每日最新資訊28at.com

String textBlock = """                   This is a text block                   spanning multiple lines.                   """;

Record類型41t28資訊網(wǎng)——每日最新資訊28at.com

JDK14中新增的Record提供了更簡潔的語法來生成只用于數(shù)據(jù)存儲的類,并自動生成訪問方法、equals和hashCode比較方法以及toString方法,它可以在類內(nèi)部或方法內(nèi)部生成。它相比class類更輕量簡潔,相比Pair、Triple等組合類Record的語義上更加明確、代碼可讀性更強。41t28資訊網(wǎng)——每日最新資訊28at.com

void someMethod() {    record Product(long id, String category);    Product product = new Product(101L, "phone");    long productId = product.getId();    String productCategory = product.getCategory();}

模式匹配新語法

JDK14版本引入了模式匹配新語法,避免了冗余的類型轉(zhuǎn)換語句。41t28資訊網(wǎng)——每日最新資訊28at.com

Object obj = ...;if (obj instanceof String s) {  System.out.println("String: " + s.length());} else if (obj instanceof Integer i) {  System.out.println("Integer: " + i);} else {  System.out.println("Unknown object");}

JDK17版本后,新的模式匹配方式也可以在Switch語句中使用了。41t28資訊網(wǎng)——每日最新資訊28at.com

Object obj = ...;switch(obj) {    case String s -> System.out.println("String: " + s.length());    case Integer i -> System.out.println("Integer: " + i);    default -> System.out.println("Unknown object");}

密封類

密封類(Sealed Class)是JDK15引入的新特性,當使用sealed關(guān)鍵字修飾一個抽象類時,表示這個抽象類只允許指定的類來繼承實現(xiàn)。41t28資訊網(wǎng)——每日最新資訊28at.com

如下ProductField類只允許Cate、Brand、Model類繼承,這種特性避免了意料外的類型擴展,提升了類型安全性。41t28資訊網(wǎng)——每日最新資訊28at.com

sealed abstract class ProductField permits Cate, Brand, Model {   //...}

此外,JDK新版本還有向量API等新特性和諸多改進等待我們探索發(fā)現(xiàn)。41t28資訊網(wǎng)——每日最新資訊28at.com

2.2 新GC算法簡介

ZGC介紹41t28資訊網(wǎng)——每日最新資訊28at.com

ZGC在JDK11作為實驗性的GC算法被引入時,最初的設計目標是實現(xiàn)10毫秒以內(nèi)的最大停頓時間。在過去一段時間里,ZGC經(jīng)過JDK版本的數(shù)次迭代,在JDK15中被宣布為可用于生產(chǎn),目前據(jù)官方介紹已經(jīng)可以實現(xiàn)亞毫秒級的最大停頓時間,且停頓時間不隨堆內(nèi)存、存活對象集合或GCRoot集合大小的增加而增加,它可以處理從8MB到16TB的大范圍堆內(nèi)存。41t28資訊網(wǎng)——每日最新資訊28at.com

在官方介紹里,ZGC是并發(fā)的、基于區(qū)域的(Region-based)、壓縮的(Compacting)、NUMA感知(NUMA-aware)的垃圾回收器。它主要使用了染色指針(Colored Pointor)和讀屏障(Load Barriers)技術(shù),并在新一代的JDK21版本中實現(xiàn)了分代回收,它的主要工作是在用戶線程工作執(zhí)行時完成的,這大大降低了GC對應用響應時間的影響。41t28資訊網(wǎng)——每日最新資訊28at.com

使用如下JVM啟動參數(shù)可以快速應用ZGC:41t28資訊網(wǎng)——每日最新資訊28at.com

-XX:+UseZGC

Shenandoah GC介紹41t28資訊網(wǎng)——每日最新資訊28at.com

Shenandoah GC是一種全新的低延遲垃圾收集器,在JDK 8的部分版本可用,從JDK 11版本正式引入,它通過讀寫屏障和并發(fā)標記技術(shù),可以極大縮短GC時的應用程序停頓。41t28資訊網(wǎng)——每日最新資訊28at.com

相比CMS、G1等算法,其停頓時間更短,支持超大內(nèi)存,非常適合對響應時間敏感類型的服務。由于Shenandoah使用了讀寫屏障技術(shù),雖然可能導致吞吐量略降,但總體來說是更有效的GC算法之一。41t28資訊網(wǎng)——每日最新資訊28at.com

使用如下參數(shù)可以快速應用Shenandoah GC:41t28資訊網(wǎng)——每日最新資訊28at.com

-XX:+UseShenandoahGC

3 升級過程

JDK版本升級無需做太多代碼改動,但要平滑過渡到新版本,也需要做充分準備和規(guī)劃。本節(jié)將分享我們升級到JDK17的具體步驟,在此過程中遇到的問題及解決方法,以及對ZGC相關(guān)問題的分析。41t28資訊網(wǎng)——每日最新資訊28at.com

3.1 升級步驟

安裝JDK1741t28資訊網(wǎng)——每日最新資訊28at.com

我們在本地測試時選擇了Eclipse Temurin Build版本,根據(jù)官網(wǎng)介紹它是由基于OpenJDK的開源Java SE產(chǎn)生的構(gòu)建版本,這里根據(jù)開發(fā)環(huán)境的機器配置下載并安裝了jdk-17.0.7+7 macos aarch64版本。41t28資訊網(wǎng)——每日最新資訊28at.com

調(diào)整IDE配置

在使用IntelliJ Idea開發(fā)環(huán)境時,可以在文件--項目結(jié)構(gòu)配置中,將SDK選項調(diào)整到剛剛安裝的JDK版本。41t28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片41t28資訊網(wǎng)——每日最新資訊28at.com

調(diào)整項目配置

由于我們的項目是Maven項目,需要選擇POM文件,修改Maven的編譯插件的source和target配置到17。41t28資訊網(wǎng)——每日最新資訊28at.com

<properties>  <jdk.version>17</jdk.version></properties>...<plugins>  <plugin>    <groupId>org.apache.maven.plugins</groupId>    <artifactId>maven-compiler-plugin</artifactId>    <configuration>      <source>${jdk.version}</source>      <target>${jdk.version}</target>    </configuration>  </plugin></plugins>

部署測試

本地編譯測試通過后,意味著可以到測試環(huán)境進行部署和驗證了,驗證內(nèi)容包括全場景的功能驗證、DIFF驗證、壓力性能測試等等(由于部署功能是由公司其他系統(tǒng)提供,不展開敘述)。41t28資訊網(wǎng)——每日最新資訊28at.com

升級JDK17后,JVM啟動參數(shù)需要調(diào)整,一些舊參數(shù)被廢棄,同時增加新的參數(shù),我們用于測試環(huán)境部署的參數(shù)為:41t28資訊網(wǎng)——每日最新資訊28at.com

-Xms6g -Xmx6g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -Xss256k -XX:+UseZGC -XX:ParallelGCThreads=12

生產(chǎn)環(huán)境部署及效果數(shù)據(jù)回收41t28資訊網(wǎng)——每日最新資訊28at.com

升級JDK后,回收線上服務的效果數(shù)據(jù)至關(guān)重要,我們主要關(guān)注服務延時表現(xiàn)、GC暫停表現(xiàn)以及內(nèi)存消耗表現(xiàn)。41t28資訊網(wǎng)——每日最新資訊28at.com

我們選擇服務集群的50%節(jié)點來部署JDK17,另外50%節(jié)點保持JDK8不變作為對照組,分配節(jié)點時,保持各組的節(jié)點機器配置情況一致,將實驗變量控制在僅JDK版本的切換上。41t28資訊網(wǎng)——每日最新資訊28at.com

同時將服務訪問的延時信息、GC暫停信息、堆內(nèi)存使用信息上報到日志收集系統(tǒng)。由于前者的日志規(guī)模龐大,為了獲取更精確的統(tǒng)計信息,通過上報到大數(shù)據(jù)平臺并使用HiveSql分析,后兩者則通過上報Promethues監(jiān)控平臺來實現(xiàn)實時信息收集。41t28資訊網(wǎng)——每日最新資訊28at.com

3.2 遇到問題及解決方法

在實際編譯和部署的過程中,還可能會遇到各種各樣的問題,下面我們對遇到的問題及解決方法做了一些梳理。41t28資訊網(wǎng)——每日最新資訊28at.com

以下為編譯期間遇到的一些問題:41t28資訊網(wǎng)——每日最新資訊28at.com

非法字符引發(fā)的異常41t28資訊網(wǎng)——每日最新資訊28at.com

Maven編譯期間遇見如下報錯:41t28資訊網(wǎng)——每日最新資訊28at.com

[ERROR] Internal error: java.lang.IllegalArgumentException: Malformed /uxxxx encoding. -> [Help 1]

問題原因:這是Maven在加載一些配置文件時遇到了不兼容的編碼字符導致的。本地Maven倉庫路徑下的resolver-status.properties文件中存在格式不正確的unicode編碼字符,這些字符在JDK 17的字符串處理方式下無法解析。41t28資訊網(wǎng)——每日最新資訊28at.com

解決方法:使用以下命令,遞歸刪除本地倉庫下所有的resolver-status.properties文件:41t28資訊網(wǎng)——每日最新資訊28at.com

find ~/.m2/ -name resolver-status.properties -delete

包不存在引發(fā)的異常41t28資訊網(wǎng)——每日最新資訊28at.com

編譯器期間提示包不存在:41t28資訊網(wǎng)——每日最新資訊28at.com

import javafx.util.Pair

問題原因:javafx等包在JDK新版本中被默認移除。41t28資訊網(wǎng)——每日最新資訊28at.com

解決方法:可以使用apache.commons提供的Pair類替代,也可以手動引入被移除的依賴,其他被移除的類也可以通過類似的方法解決。41t28資訊網(wǎng)——每日最新資訊28at.com

以下為部署期間遇到的問題:41t28資訊網(wǎng)——每日最新資訊28at.com

JVM參數(shù)引發(fā)的異常41t28資訊網(wǎng)——每日最新資訊28at.com

啟動階段可能遇到類似如下問題:41t28資訊網(wǎng)——每日最新資訊28at.com

Unrecognized VM option 'UseGCLogFileRotation'Error: Could not create the Java Virtual Machine.Error: A fatal exception has occurred. Program will exit.

問題原因:部分JVM參數(shù)在新版本不再兼容,導致不能識別。41t28資訊網(wǎng)——每日最新資訊28at.com

解決方法:從啟動參數(shù)里將不兼容的參數(shù)移除即可,同時尋找替代參數(shù)。41t28資訊網(wǎng)——每日最新資訊28at.com

反射訪問引發(fā)的異常41t28資訊網(wǎng)——每日最新資訊28at.com

如以下日志所示,我們在初始化apollo配置中心組件時遇到了啟動異常,從異常描述看是程序反射訪問期間引起的。41t28資訊網(wǎng)——每日最新資訊28at.com

java.lang.IllegalArgumentException: Cannot instantiate interface org.springframework.context.ApplicationContextInitializer : com.ctrip.framework.apollo.spring.boot.ApolloApplicationContextInitializer        ...        at com.bj58.spat.scf.server.bootstrap.Main.main(Main.java:27) [zzscf.server-2.7.12.jar:?]Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.ctrip.framework.apollo.spring.boot.ApolloApplicationContextInitializer]: Constructor threw exception; nested exception is com.ctrip.framework.apollo.exceptions.ApolloConfigException: [ARCH_APOLLO_CLIENT]Unable to load instance for com.ctrip.framework.apollo.spring.config.ConfigPropertySourceFactory!        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:154) ~[spring-beans-4.3.12.RELEASE.jar:4.3.12.RELEASE]        at org.springframework.boot.SpringApplication.createSpringFactoriesInstances(SpringApplication.java:409) ~[spring-boot-1.5.8.RELEASE.jar:1.5.8.RELEASE]        ... 8 more...Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make protected final java.lang.Class java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain) throws java.lang.ClassFormatError accessible: module java.base does not "opens java.lang" to unnamed module @5e265ba4        at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354) ~[?:?]        at java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297) ~[?:?]        at java.lang.reflect.Method.checkCanSetAccessible(Method.java:199) ~[?:?]        at java.lang.reflect.Method.setAccessible(Method.java:193) ~[?:?]...

問題原因:新版本JDK引入了模塊訪問控制,跨模塊時無法簡單的直接通過反射訪問了,上述異常是想要通過反射訪問Java內(nèi)部模塊而拋出的41t28資訊網(wǎng)——每日最新資訊28at.com

解決方法:對于此類問題,可以通過臨時增加如下啟動參數(shù)解決,也可以查閱依賴包的新版本,了解它們是否已對JDK新版本做出了適配41t28資訊網(wǎng)——每日最新資訊28at.com

--add-opens java.base/java.lang=ALL-UNNAMED

java.base/java.lang是本次異常需要用到的模塊參數(shù),在解決此類異常時,需要根據(jù)實際要訪問的模塊名進行調(diào)整,以下為我們收集的一些啟動參數(shù),可以按需增加啟動參數(shù)配置。41t28資訊網(wǎng)——每日最新資訊28at.com

--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/java=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/java.security=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED --add-opens java.base/java.time=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/jdk.internal.access=ALL-UNNAMED --add-opens java.base/jdk.internal.misc=ALL-UNNAMED

注解類型被默認移除引發(fā)的異常41t28資訊網(wǎng)——每日最新資訊28at.com

啟動過程中,發(fā)現(xiàn)拋出了如下空指針異常41t28資訊網(wǎng)——每日最新資訊28at.com

Caused by: java.lang.NullPointerException: Cannot invoke "String.length()" because "s" is null        at java.base/java.URLEncoder.encode(URLEncoder.java:224)        at java.base/java.URLEncoder.encode(URLEncoder.java:196)        at com.bj58.zhuanzhuan.arch.service.manager.sdk.client.CallPermissionService.initUri(CallPermissionService.java:192)        at com.bj58.zhuanzhuan.arch.service.manager.sdk.client.CallPermissionService.<init>(CallPermissionService.java:72)        at com.bj58.spat.scf.server.filter.BlackKeyRequestFilter.afterPropertiesSet(BlackKeyRequestFilter.java:120)        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)        ... 15 more

問題原因:分析調(diào)用鏈路后發(fā)現(xiàn),問題發(fā)生在一個上下文類,它的init方法是通過@PostConstruct注解觸發(fā)執(zhí)行的,該注解在JDK新版本中被默認移除了,導致init方法未能執(zhí)行41t28資訊網(wǎng)——每日最新資訊28at.com

解決方法:短期可以通過手動引入以下依賴方式解決,長期同樣可以查閱依賴包維護方的更新日志,或與維護方進行溝通,將依賴更新到已適配版本。41t28資訊網(wǎng)——每日最新資訊28at.com

<dependency>    <groupId>javax.annotation</groupId>    <artifactId>javax.annotation-api</artifactId>    <version>1.3.2</version></dependency>

此外我們在發(fā)布到生產(chǎn)環(huán)境后,還遇到了以下問題:41t28資訊網(wǎng)——每日最新資訊28at.com

ZGC的虛擬內(nèi)存申請的疑問41t28資訊網(wǎng)——每日最新資訊28at.com

我們的服務升級JDK并在實際生產(chǎn)環(huán)境部署后,同物理節(jié)點的其他服務曾出現(xiàn)了一次短暫的資源耗盡異常,當時我們懷疑導致問題原因之一是ZGC申請了過多的虛擬內(nèi)存。41t28資訊網(wǎng)——每日最新資訊28at.com

針對ZGC申請過多虛擬內(nèi)存問題,我們經(jīng)過排查發(fā)現(xiàn),這并不是JDK17存在的問題,而是由ZGC自身的實現(xiàn)機制所導致的。ZGC通過染色指針和多重映射技術(shù)來實現(xiàn)高吞吐低延遲的GC。41t28資訊網(wǎng)——每日最新資訊28at.com

為了實現(xiàn)染色指針,ZGC需要使用地址高位額外的bit來記錄對象狀態(tài),所以需要的虛擬內(nèi)存空間遠高于實際堆大小。此外,以目前JDK17版本,它還會為不同狀態(tài)的對象分配獨立的虛擬內(nèi)存,以實現(xiàn)并發(fā)回收,具體來說需要為remapped、marked0、marked1三種狀態(tài)申請三份獨立虛擬內(nèi)存空間。41t28資訊網(wǎng)——每日最新資訊28at.com

以4TB堆為例,ZGC需要4bit用于染色,所以需要4TB * 2^4 = 128TB虛擬內(nèi)存。它還會為每種染色狀態(tài)各自申請128TB空間。所以4TB堆最終會申請128TB * 3約等于384TB的虛擬內(nèi)存。41t28資訊網(wǎng)——每日最新資訊28at.com

本例中我們的服務實際使用6GB堆,通過與內(nèi)存工具Native Memory Tracking輸出結(jié)果比對,發(fā)現(xiàn)跟公式計算結(jié)果一致,ZGC申請了約300GB的虛擬內(nèi)存,符合其技術(shù)實現(xiàn)的需要。41t28資訊網(wǎng)——每日最新資訊28at.com

所以結(jié)論是ZGC申請?zhí)摂M內(nèi)存并非JDK問題,是其特有的技術(shù)實現(xiàn)方式導致。41t28資訊網(wǎng)——每日最新資訊28at.com

4 升級效果

以下是我們在轉(zhuǎn)轉(zhuǎn)的通用推薦服務升級過程中,持續(xù)對比三個全天收集到的效果數(shù)據(jù),我們設立50%節(jié)點升級到JDK17作為實驗組,另50%節(jié)點不升級作為對照組。41t28資訊網(wǎng)——每日最新資訊28at.com

4.1 整體耗時對比

首先看下服務的整體耗時數(shù)據(jù),如下圖所示,可以看到該服務升級JDK17后tp999及tp9999時間有顯著降低。41t28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片41t28資訊網(wǎng)——每日最新資訊28at.com

整體耗時對比

通過新版本GC算法的引入,服務處理請求的尾部延時情況得到了改善,響應時間的毛刺問題明顯減輕。41t28資訊網(wǎng)——每日最新資訊28at.com

下表為詳細數(shù)據(jù):41t28資訊網(wǎng)——每日最新資訊28at.com

指標/版本
41t28資訊網(wǎng)——每日最新資訊28at.com

JDK8
41t28資訊網(wǎng)——每日最新資訊28at.com

JDK17
41t28資訊網(wǎng)——每日最新資訊28at.com

降幅
41t28資訊網(wǎng)——每日最新資訊28at.com

AVG耗時
41t28資訊網(wǎng)——每日最新資訊28at.com

22ms
41t28資訊網(wǎng)——每日最新資訊28at.com

22ms41t28資訊網(wǎng)——每日最新資訊28at.com

持平
41t28資訊網(wǎng)——每日最新資訊28at.com

TP50耗時
41t28資訊網(wǎng)——每日最新資訊28at.com

11ms
41t28資訊網(wǎng)——每日最新資訊28at.com

11ms
41t28資訊網(wǎng)——每日最新資訊28at.com

持平
41t28資訊網(wǎng)——每日最新資訊28at.com

TP90耗時
41t28資訊網(wǎng)——每日最新資訊28at.com

57ms
41t28資訊網(wǎng)——每日最新資訊28at.com

57ms
41t28資訊網(wǎng)——每日最新資訊28at.com

持平
41t28資訊網(wǎng)——每日最新資訊28at.com

TP99耗時
41t28資訊網(wǎng)——每日最新資訊28at.com

149ms
41t28資訊網(wǎng)——每日最新資訊28at.com

148ms
41t28資訊網(wǎng)——每日最新資訊28at.com

0.67%
41t28資訊網(wǎng)——每日最新資訊28at.com

TP999耗時
41t28資訊網(wǎng)——每日最新資訊28at.com

249ms
41t28資訊網(wǎng)——每日最新資訊28at.com

242ms
41t28資訊網(wǎng)——每日最新資訊28at.com

2.81%
41t28資訊網(wǎng)——每日最新資訊28at.com

TP9999耗時
41t28資訊網(wǎng)——每日最新資訊28at.com

601ms
41t28資訊網(wǎng)——每日最新資訊28at.com

458ms
41t28資訊網(wǎng)——每日最新資訊28at.com

23.78%
41t28資訊網(wǎng)——每日最新資訊28at.com

4.2 分節(jié)點耗時對比

在分節(jié)點的指標對比上,我們發(fā)現(xiàn)應用JDK17的節(jié)點在tp999和tp9999這兩個高延遲分位數(shù)指標上的表現(xiàn)更加平穩(wěn)。41t28資訊網(wǎng)——每日最新資訊28at.com

如下圖所示,相比保持JDK8的對照組節(jié)點,升級到JDK17的實驗組節(jié)點,其tp999和tp9999指標的變化曲線更加平坦。41t28資訊網(wǎng)——每日最新資訊28at.com

節(jié)點TP999耗時對比節(jié)點TP999耗時對比41t28資訊網(wǎng)——每日最新資訊28at.com


41t28資訊網(wǎng)——每日最新資訊28at.com

節(jié)點TP9999耗時對比節(jié)點TP9999耗時對比41t28資訊網(wǎng)——每日最新資訊28at.com


41t28資訊網(wǎng)——每日最新資訊28at.com

4.3 GC停頓時長對比

對于GC數(shù)據(jù),我們收集了服務晚間4小時JDK8和JDK17版本的GC停頓數(shù)據(jù)。JDK8統(tǒng)計了其Young GC的暫停時間,而JDK 17統(tǒng)計了ZGC Pause時間。41t28資訊網(wǎng)——每日最新資訊28at.com

從下表可以明顯看出,使用JDK17的ZGC算法后,GC停頓時長大幅減少。JDK8下YGC每分鐘平均暫停時間為221ms,而JDK 17下的ZGC只有0.37ms,降幅高達99.83%。41t28資訊網(wǎng)——每日最新資訊28at.com

指標/版本
41t28資訊網(wǎng)——每日最新資訊28at.com

JDK8
41t28資訊網(wǎng)——每日最新資訊28at.com

JDK17
41t28資訊網(wǎng)——每日最新資訊28at.com

降幅
41t28資訊網(wǎng)——每日最新資訊28at.com

統(tǒng)計口徑
41t28資訊網(wǎng)——每日最新資訊28at.com

YGC時間
41t28資訊網(wǎng)——每日最新資訊28at.com

ZGC Pause時間
41t28資訊網(wǎng)——每日最新資訊28at.com

-
41t28資訊網(wǎng)——每日最新資訊28at.com

總時長
41t28資訊網(wǎng)——每日最新資訊28at.com

106250ms
41t28資訊網(wǎng)——每日最新資訊28at.com

221ms
41t28資訊網(wǎng)——每日最新資訊28at.com

99.67%
41t28資訊網(wǎng)——每日最新資訊28at.com

每分鐘平均時長
41t28資訊網(wǎng)——每日最新資訊28at.com

355ms
41t28資訊網(wǎng)——每日最新資訊28at.com

0.37ms
41t28資訊網(wǎng)——每日最新資訊28at.com

99.83%
41t28資訊網(wǎng)——每日最新資訊28at.com

停頓時間的降低不僅提高了服務的可用性,也使系統(tǒng)吞吐量獲得大幅提升。41t28資訊網(wǎng)——每日最新資訊28at.com

4.4 堆空間占用對比

從下表統(tǒng)計數(shù)據(jù)可以看出,使用JDK 17后,相同堆空間配置下,實際堆內(nèi)存占用有所降低,堆空間的利用效率得到提高。41t28資訊網(wǎng)——每日最新資訊28at.com

在同為6G堆大小情況下,JDK 8堆占用平均為2.92G,占比48.7%;而JDK 17堆占用平均減少至2.42G,占比降至40.3%。堆內(nèi)存占用比降低了17.2%。41t28資訊網(wǎng)——每日最新資訊28at.com

這表明在不改變堆區(qū)設置的前提下,JDK 17可以提高堆空間的利用效率,降低內(nèi)存占用,為系統(tǒng)留出更多可用內(nèi)存空間,從而提高系統(tǒng)穩(wěn)定性。41t28資訊網(wǎng)——每日最新資訊28at.com

指標/版本
41t28資訊網(wǎng)——每日最新資訊28at.com

JDK8
41t28資訊網(wǎng)——每日最新資訊28at.com

JDK17
41t28資訊網(wǎng)——每日最新資訊28at.com

降幅
41t28資訊網(wǎng)——每日最新資訊28at.com

堆空間申請
41t28資訊網(wǎng)——每日最新資訊28at.com

6G
41t28資訊網(wǎng)——每日最新資訊28at.com

6G
41t28資訊網(wǎng)——每日最新資訊28at.com

-
41t28資訊網(wǎng)——每日最新資訊28at.com

每分鐘平均堆占用
41t28資訊網(wǎng)——每日最新資訊28at.com

2.922G
41t28資訊網(wǎng)——每日最新資訊28at.com

2.419G
41t28資訊網(wǎng)——每日最新資訊28at.com

17.20%
41t28資訊網(wǎng)——每日最新資訊28at.com

每分鐘平均堆占用比
41t28資訊網(wǎng)——每日最新資訊28at.com

48.70%
41t28資訊網(wǎng)——每日最新資訊28at.com

40.32%
41t28資訊網(wǎng)——每日最新資訊28at.com

17.20%
41t28資訊網(wǎng)——每日最新資訊28at.com

另外ZGC提供了-XX:SoftMaxHeapSize參數(shù),用于彈性調(diào)節(jié)堆空間的最大值,當堆大小未超出設定值時可以釋放更多空閑內(nèi)存。41t28資訊網(wǎng)——每日最新資訊28at.com

5 總結(jié)

截止至發(fā)文,服務已成功部署應用JDK17并平穩(wěn)運行一月有余。通過本次升級,我們獲得了顯著的GC停頓時間和內(nèi)存占用率的改善效果,有效解決了服務GC問題,進而降低了服務高分位延遲指標,充分驗證了JDK17新版本GC算法的優(yōu)勢。41t28資訊網(wǎng)——每日最新資訊28at.com

同時,我們也積累了語法改進、升級中跨部門協(xié)調(diào)、問題排查等方面的寶貴經(jīng)驗。升級過程中遇到了服務穩(wěn)定性問題,也讓我們意識到需要對新特性有更深入的理解,平穩(wěn)地應用到生產(chǎn)環(huán)境。41t28資訊網(wǎng)——每日最新資訊28at.com

后續(xù)我們將繼續(xù)關(guān)注JDK新版本的特性改進,并逐步將搜索推薦核心服務完全升級到JDK17新版本,以獲得更好的開發(fā)體驗和服務運行效果。41t28資訊網(wǎng)——每日最新資訊28at.com

關(guān)于作者41t28資訊網(wǎng)——每日最新資訊28at.com

曾祥瑞,轉(zhuǎn)轉(zhuǎn)搜索推薦研發(fā)工程師41t28資訊網(wǎng)——每日最新資訊28at.com

銳意進取,勇于試驗,與時俱進。41t28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-11831-0.html解決GC毛刺問題——轉(zhuǎn)轉(zhuǎn)搜索推薦服務JDK17升級實踐

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 微軟在 GitHub 上線開發(fā)工具包,助力開發(fā)者使用 Rust 語言編寫 Windows 驅(qū)動

下一篇: 18個不可不知的Spring Cloud微服務架構(gòu)知識點

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
夜夜嗨av一区二区三区四季av| 国产乱码精品一区二区三区五月婷 | 亚洲女同同性videoxma| 亚洲免费视频一区二区| 久久精品一区四区| 欧美国产一区二区在线观看| 欧美日韩国产综合视频在线观看中文 | 性做久久久久久| 久久久久国色av免费观看性色| 麻豆免费精品视频| 欧美性猛交视频| 国产一区二区三区高清| 亚洲国产一区二区三区青草影视 | 一本色道久久88亚洲综合88| 性一交一乱一区二区洋洋av| 美乳少妇欧美精品| 欧美三区在线视频| 国产亚洲一级高清| 亚洲毛片在线免费观看| 亚洲欧美日本视频在线观看| 蜜臀a∨国产成人精品| 国产精品成人免费| 在线观看亚洲视频| 亚洲影院在线| 欧美成人激情在线| 国产精品人成在线观看免费| 在线精品一区| 午夜久久资源| 欧美高清视频www夜色资源网| 国产精品视频免费观看www| 91久久精品国产91久久性色| 欧美一区91| 欧美精品在线一区二区三区| 国产日本精品| 一区二区不卡在线视频 午夜欧美不卡在 | 国产亚洲aⅴaaaaaa毛片| 亚洲日本中文字幕| 久久精品国产欧美亚洲人人爽| 欧美女同视频| 一区在线观看视频| 亚洲欧美日韩在线不卡| 欧美久久久久久| 精品成人一区二区三区| 亚洲制服av| 欧美日韩国产区| 一区二区在线看| 欧美一级视频| 国产精品人人做人人爽| 亚洲精品偷拍| 久久香蕉精品| 国产一二三精品| 亚洲欧美视频在线| 欧美视频一区二区三区| 亚洲国产日韩一区二区| 久久久久高清| 国产午夜精品久久久| 亚洲影院色无极综合| 欧美日韩在线播放一区二区| 亚洲日本成人在线观看| 久热国产精品| 黄色成人av在线| 久久激情五月激情| 国产亚洲欧美色| 午夜精品成人在线| 国产精品超碰97尤物18| 亚洲美女精品成人在线视频| 蜜臀va亚洲va欧美va天堂 | 亚洲一区免费在线观看| 欧美日韩成人一区| 亚洲国产欧美一区二区三区久久 | 免费h精品视频在线播放| 狠狠色狠狠色综合| 午夜免费日韩视频| 国产精品美女在线观看| 亚洲午夜黄色| 欧美日韩影院| 亚洲视频中文字幕| 欧美视频在线观看| 日韩视频中文| 欧美人与禽猛交乱配| 亚洲精品免费在线观看| 欧美激情按摩| 亚洲卡通欧美制服中文| 欧美精品一区二区三| 91久久久亚洲精品| 欧美va亚洲va香蕉在线| 亚洲国产精品免费| 欧美黄色成人网| 日韩写真在线| 欧美日韩免费一区二区三区视频| 亚洲精品国产精品乱码不99按摩| 欧美大秀在线观看| 亚洲免费成人av| 欧美乱在线观看| 中文在线一区| 国产精品一区久久久久| 午夜日韩在线观看| 国内精品国产成人| 免费日韩精品中文字幕视频在线| 亚洲电影下载| 欧美激情综合网| 亚洲一区二区三区免费在线观看 | 亚洲视频精品| 欧美午夜在线观看| 亚洲欧美中文日韩v在线观看| 国产日韩专区| 乱中年女人伦av一区二区| 亚洲激情电影中文字幕| 欧美日韩视频| 国产精品播放| 亚洲免费视频一区二区| 国产欧美日韩在线视频| 久久国产精品免费一区| 影音先锋久久| 欧美日韩成人一区二区| 亚洲欧洲99久久| 影音欧美亚洲| 欧美日韩国产高清| 午夜精品福利一区二区蜜股av| 国内激情久久| 欧美精品日韩www.p站| 亚洲综合电影| 伊人激情综合| 欧美日精品一区视频| 欧美一区二区三区久久精品| 亚洲成人在线免费| 欧美日本国产精品| 欧美一区二区三区在线观看| 亚洲国产美国国产综合一区二区| 欧美日韩一区二区三区在线 | 国产精品入口日韩视频大尺度| 久久久精品国产免大香伊| 亚洲国产日韩欧美在线动漫 | 99视频精品全国免费| 国产日韩欧美一区| 欧美.日韩.国产.一区.二区| 亚洲一区不卡| 亚洲第一在线综合在线| 国产精品成人在线观看| 久久性天堂网| 亚洲一区免费| 91久久国产精品91久久性色| 国产精品亚洲综合天堂夜夜| 蜜桃久久精品乱码一区二区| 亚洲一区亚洲| 亚洲国产日韩欧美| 国产偷自视频区视频一区二区| 欧美极品aⅴ影院| 久久精品导航| 在线亚洲一区观看| 伊大人香蕉综合8在线视| 国产精品v日韩精品| 老司机精品视频网站| 西瓜成人精品人成网站| 亚洲欧洲日韩综合二区| 国产欧美精品一区二区三区介绍| 欧美激情一区二区三区成人| 久久www成人_看片免费不卡| 亚洲色图综合久久| 亚洲激情成人在线| 国产中文一区| 国产精品久在线观看| 欧美国产日韩视频| 久久中文字幕一区| 欧美一区二区三区日韩| 一区二区三区高清在线观看| 亚洲福利视频在线| 国产在线日韩| 国产精品自拍小视频| 欧美日韩一区二区三区在线看| 鲁鲁狠狠狠7777一区二区| 欧美一区二区在线播放| 亚洲永久精品国产| 一区二区精品| 最新成人av网站| 精品99一区二区| 国产视频在线观看一区二区三区| 国产精品捆绑调教| 欧美另类女人| 欧美国产乱视频| 免费在线观看一区二区| 久久久久久久久岛国免费| 久久gogo国模裸体人体| 欧美一级专区免费大片| 亚洲一区二区在线播放| 中文一区在线| 夜夜嗨av一区二区三区四区| 日韩视频在线观看国产| 亚洲精品综合精品自拍| 亚洲黄网站在线观看| 亚洲狠狠婷婷| 亚洲国产一区二区精品专区| 亚洲国产精品女人久久久| 在线免费日韩片| 在线日韩欧美| 在线观看日韩av电影| 激情亚洲一区二区三区四区| 国产综合一区二区| 国内精品一区二区| 黄色国产精品一区二区三区| 红桃视频亚洲| 精品成人免费| 亚洲激情二区| 亚洲免费高清|