色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

從Java 8升級到Java 17全過程

jf_ro2CN3Fa ? 來源:芋道源碼 ? 作者:芋道源碼 ? 2022-11-03 14:13 ? 次閱讀


最近在做 Java8 到 Java17 的遷移工作,前期做了一些準備,但是在升級過程還是有些問題,太emo了,一些信息記錄如下,分為幾個部分:

  • 編譯相關
  • 參數遷移相關
  • 運行相關

前人栽樹后人乘涼,有需要升級的可以參考一下,避免踩坑。。。

編譯相關

JEP 320

在 Java11 中引入了一個提案 JEP 320: Remove the Java EE and CORBA Modules (openjdk.org/jeps/320) 提案,移除了 Java EE and CORBA 的模塊,如果項目中用到需要手動引入。比如代碼中用到了 javax.annotation.* 下的包:

publicabstractclassFridayAgent
@PreDestroy
publicvoiddestroy(){
agentClient.close();
}
}

在編譯時會找不到相關的類。這是因為 Java EE 已經在 Java 9 中被標記為 deprecated,Java 11 中被正式移除,可以手動引入 javax 的包:


javax.annotation
javax.annotation-api
1.3.2

使用了 sun.misc.* 下的包

比如 sun.misc.BASE64Encoder,這個簡單,替換一下工具類即可。

[ERROR]symbol:classBASE64Encoder
[ERROR]location:packagesun.misc

netty 低版本使用了 sun.misc.*,編譯錯誤信息如下

Causedby:java.lang.NoClassDefFoundError:Couldnotinitializeclassio.netty.util.internal.PlatformDependent0
atio.netty.util.internal.PlatformDependent.getSystemClassLoader(PlatformDependent.java:694)~[netty-all-4.0.42.Final.jar!/:4.0.42.Final]

對應的源碼如下:

/**
*The{@linkPlatformDependent}operationswhichrequiresaccessto{@codesun.misc.*}.
*/
finalclassPlatformDependent0{
}

https://github.com/netty/netty/issues/6855

lombok 使用了 com.sun.tools.javac.* 下的包

錯誤信息如下:

Failed to execute goal org.apache.maven.plugins3.2:compile (default-compile) on project encloud-common: Fatal error compiling: java.lang.ExceptionInInitializerError: Unable to make field private com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible: module jdk.compiler does not "opens com.sun.tools.javac.processing" to unnamed module

如果你的項目中使用 lombok,而且是低版本的話,就會出現,lombok 的原理是在編譯期做一些手腳,用到了 com.sun.tools.javac 下的文件,升級到最新版可以解決。ps,個人很不喜歡 lombok, 調試的時候代碼和 class 對不上真的很惡心。

<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>

<version>1.18.24version>
dependency>

kotlin 版本限制

我們后端在很多年前就 all-in Kotlin,Kotlin 的升級也是我們的重中之重。

[ERROR] Failed to execute goal org.jetbrains.kotlin1.2.71:compile (compile) on project encloud-core: Compilation failure [ERROR] Unknown JVM target version: 17 [ERROR] Supported versions: 1.6, 1.8

Kotlin 在 1.6.0 版本開始支持 Java17 的字節碼,低于 1.6.0 的編譯會直接報錯

廢棄依賴分析

可以用 jdeps --jdk-internals --multi-release 17 --class-path . encloud-api.jar 來做項目的依賴分析

1743ec08-5b3e-11ed-a3b6-dac502259ad0.jpg

這樣你就可以知道哪些庫需要做升級了。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

參數遷移

什么是 Unified Logging

在 Java 領域,有廣為人知的日志框架,slf4j、log4j 等,這些框架提供了統一的編程接口,讓用戶可以通過簡單的配置實現日志輸出的個性化配置,比如日志 tag、級別(info、debug 等)、上下文(線程 id、行號、時間等),在 JVM 內部之前一直缺乏這樣的規范,于是出來了 Unified Logging,實現了日志格式的大一統,這就是我們接下來要介紹的重點 Unified Logging

我們接觸最多的是 gc 的日志,在 java8 中,我們配置 gc 日志的參數是 -Xloggc:/tmp/gc.log。在 JVM 中除了 GC,還有大量的其它相關的日志,比如線程、os 等,在新的 Unified Logging 日志中,日志輸出的方式變更為了 java -Xlog:xxx,GC 不再特殊只是做為日志的一種存在形式。

java-Xlog-version

輸出結果如下:

174f20b4-5b3e-11ed-a3b6-dac502259ad0.jpg

可以看到日志輸出里,不僅有 GC 相關的日志,還有 os 線程相關的信息。事實上 java 的日志的生產者有非常多部分,比如 thread、class load、unload、safepoint、cds 等。

17663646-5b3e-11ed-a3b6-dac502259ad0.jpg

歸根到底,日志打印,需要回答清楚三個問題:

  • what:要輸出什么信息(tag),以什么日志級別輸出(level)
  • where:輸出到哪里(console 還是 file)
  • decorators:日志如何

輸出什么信息(selectors)

首先來看 what 的部分,如何指定要輸出哪些信息,這個在 JVM 內部被稱之為 selectors。

JVM 采用的是 =的形式來表示 selectors,默認情況下,tag 為all,表示所有的 tag,level 為 INFOjava -Xlog -version 等價于下面的形式

java-Xlog:all=info-version

如果我們想輸出tag 為 gc,日志級別為 debug 的日志,可以用 java -Xlog:gc=debug 的形式:

$java-Xlog:gc=debug-version
[0.023s][info][gc]UsingG1
[0.023s][debug][gc]ConcGCThreads:3offset22
[0.023s][debug][gc]ParallelGCThreads:10
[0.024s][debug][gc]Initializemarkstackwith4096chunks,maximum524288

這樣就輸出了 tag 為 gc,級別為 debug 的日志信息。

不過這里有一個比較坑的點是,這里的 tag 匹配規則是精確匹配,如果某條日志的 tag 是 gc,metaspace,通過上面的規則是匹配不到的,我們可以手動指定的方式來輸出。

$java-Xlog:gc+metaspace-version

[0.022s][info][gc,metaspace]CDSarchive(s)mappedat:...size12443648.
[0.022s][info][gc,metaspace]Compressedclassspacemappedat:reservedsize:...
[0.022s][info][gc,metaspace]Narrowklassbase:...,Narrow
klassshift:0,Narrowklassrange:0x100000000

這里的 selector 也是可以進行組合的,不同的 selector 之間用逗號分隔即可。比如同時輸出 gcgc+metaspace 這兩類 tag 的日志,就可以這么寫:

$java-Xlog:gc=debug,gc+metaspace-version

[0.020s][info][gc]UsingG1
[0.020s][debug][gc]ConcGCThreads:3offset22
[0.020s][debug][gc]ParallelGCThreads:10
[0.020s][debug][gc]Initializemarkstackwith4096chunks,maximum524288
[0.022s][info][gc,metaspace]CDSarchive(s)mappedat:
[0.022s][info][gc,metaspace]Compressedclassspacemappedat:
[0.022s][info][gc,metaspace]Narrowklassbase:0x0000000800000000

當然這么搞是很麻煩的,JVM 提供了通配符 * 來解決精確匹配的問題,比如我們想要所有 tag 為 gc 的日志,可以這么寫:

$java-Xlog:gc*=debug-version

[0.024s][debug][gc,heap]Minimumheap8388608
[0.024s][info][gc]UsingG1
[0.024s][debug][gc,heap,coops]Heapaddress:0x0000000707400000
[0.024s][debug][gc]ConcGCThreads:3offset22
[0.024s][debug][gc]ParallelGCThreads:10
[0.024s][debug][gc]Initializemarkstackwith4096chunks
[0.024s][debug][gc,ergo,heap]Expandtheheap.requestedexpansionamount:
[0.025s][debug][gc,heap,region]Activateregions[0,125)[0.025s][debug][gc,ihop]Targetoccupancyupdate:old:0B,new:262144000B
[0.025s][debug][gc,ergo,refine]InitialRefinementZones:green:2560
[0.026s][debug][gc,task]G1ServiceThread
[0.026s][debug][gc,task]G1ServiceThread(PeriodicGCTask)(register)
[0.026s][info][gc,init]Version:17.0.3+7(release)
...

如果只想要 INFO 級別的日志,則可以省略 level 的設置,使用 java -Xlog:gc* -version 即可。

如果想知道有哪些個性化的 tag 可以選擇,可以用 java -Xlog:help 來找到所有可用的 tag。

階段性小結

17736456-5b3e-11ed-a3b6-dac502259ad0.jpg

第二部分:輸出到哪里(output)

默認情況下,日志會輸出到 stdout,jvm 支持以下三種輸出方式:

  • stdout
  • stderr
  • file

一般而言我們會把日志輸出到文件中,方便后續進一步分析

-Xlog:all=debug:file=/path_to_logs/app.log

還可以指定日志切割的大小和方式

-Xlogfile=/path_to_logs/app.log:filesize=104857600,filecount=5

第三部分:日志 decorators

每條日志除了正常的信息以外,還有不少日志相關的上下文信息,在 jvm 中被稱為 decorators,有下面這些可選項。

178ecf0c-5b3e-11ed-a3b6-dac502259ad0.png

比如可以用 java -Xlog:all=debuglevel,tags,time,uptime,pid -version 選項來打印日志。

[2022-06-15T1901.529+0800][0.001s][5235][info][os,thread]Threadattached
[2022-06-15T1901.529+0800][0.001s][5235][debug][os,thread]Thread5237stack...
[2022-06-15T1901.529+0800][0.001s][5235][debug][perf,datacreation]
Unified Logging 小結

輸出格式如下:

-Xlog:[selectors]:[output]:[decorators][:output-options]
  • selectors 是多個 tag 和 level 的組合,起到了 what(過濾器)的作用,格式為 tag1[+tag2...][*][=level][,...]
  • decorators 是日志相關的描述信息,也可以理解為上下文
  • output 是輸出相關的選項,一般我們會配置為輸出到文件,按文件大小切割

這里補充一個知識點,就是默認值:

  • tag:all
  • level:info
  • output:stdout
  • decorators: uptime, level, tags

GC 參數遷移

可以看到 GC 相關的參數都已經收攏到 Xlog 下,以前的很多 Java8 下的參數已經被移除或者標記為過期。

比如 PrintGCDetails 已經被 -Xlog:gc* 取代:

java-XX:+PrintGCDetails-version

[0.001s][warning][gc]-XX:+PrintGCDetailsisdeprecated.Willuse-Xlog:gc*instead.

常見的標記為廢棄的參數還有 -XX:+PrintGC-Xloggc:,遷移前后的參數如下:

舊參數 新參數
-XX:+PrintGCDetails -Xlog:gc*
-XX:+PrintGC -Xlog:gc
-Xloggc: -Xlogfile=

除此之外,大量的 GC 的參數被移除,比如常用的參數 -XX:+PrintTenuringDistribution,Java17 會拒絕啟動

java-XX:+PrintTenuringDistribution-version
UnrecognizedVMoption'PrintTenuringDistribution'
Error:CouldnotcreatetheJavaVirtualMachine.
Error:Afatalexceptionhasoccurred.Programwillexit.

更詳細的移除的參數如下

CMSDumpAtPromotionFailure,
CMSPrintEdenSurvivorChunks,
GlLogLevel,
G1PrintHeapRegions,
G1PrintRegionLivenessInfo,
G1SummarizeConcMark,
G1SummarizeRSetStats,
G1TraceConcRefinement,
G1TraceEagerReclaimHumongousObjects,
G1TraceStringSymbolTableScrubbing,
GCLogFileSize,NumberofGCLogFiles,
PrintAdaptiveSizePolicy,
PrintclassHistogramAfterFullGC,
PrintClassHistogramBeforeFullGC,
PrintCMSInitiationStatistics
PrintCMSStatistics,
PrintFLSCensus,
PrintFLSStatistics,
PrintGCApplicationConcurrentTime
PrintGCApplicationStoppedTime,
PrintGCCause,
PrintGCDateStamps,
PrintGCID,
PrintGCTaskTimeStamps,
PrintGCTimeStamps,
PrintHeapAtGC,
PrintHeapAtGCExtended,
PrintJNIGCStalls,
PrintOldPLAB
PrintParallel0ldGCPhaseTimes,
PrintPLAB,
PrintPromotionFailure,
PrintReferenceGC,
PrintStringDeduplicationStatistics,
PrintTaskqueue,
PrintTenuringDistribution,
PrintTerminationStats,
PrintTLAB,
TraceDynamicGCThreads,
TraceMetadataHumongousAllocation,
UseGCLogFileRotation,
VerifySilently

這些移除的參數大部分都能在新的日志體系下找到對應的參數,比如 PrintHeapAtGC 這個參數可以用 -Xlog:gc+heap=debug 來替代

$java-Xlog:gc+heap=debug-cp.G1GCDemo01

[0.004s][debug][gc,heap]Minimumheap8388608Initialheap268435456Maximumheap
hello,g1gc!
[12.263s][debug][gc,heap]GC(0)HeapbeforeGCinvocations=0(full0):
[12.265s][debug][gc,heap]GC(0)garbage-firstheap
[12.265s][debug][gc,heap]GC(0)regionsize2048K,1young(2048K)
[12.265s][debug][gc,heap]GC(0)Metaspaceused3678K
[12.265s][debug][gc,heap]GC(0)classspaceused300K
[12.280s][debug][gc,heap]GC(0)Uncommittableregionsaftershrink:124

雖然理解起來不太直觀,不過要記住 -XX:+PrintGCApplicationStoppedTime-XX+PrintGCApplicationConcurrentTime 這兩個參數一起被 -Xlog:safepoint 取代。

還有一個常見的參數 -XX:+PrintAdaptiveSizePolicy-Xlog:gc+ergo*=trace 取代,

[0.122s][debug][gc,ergo,refine]InitialRefinementZones:green:23,yellow:
69,red:115,minyellowsize:46
[0.142s][debug][gc,ergo,heap]Expandtheheap.requestedexpansionamount:268435456Bexpansionamount:268435456B
[2.475s][trace][gc,ergo,cset]GC(0)StartchoosingCSet.pendingcards:0predictedbasetime:10.00msremainingtime:
190.00mstargetpausetime:200.00ms
[2.476s][trace][gc,ergo,cset]GC(9)AddyoungregionstoCSet.eden:24regions,survivors:0regions,predictedyoung
regiontime:367.19ms,targetpausetime:200.00ms
[2.476s][debug][gc,ergo,cset]GC(0)FinishchoosingCSet.old:0regions,predictedoldregiontime:0.00ms,time
remaining:0.00
[2.826s][debug][gc,ergo]GC(0)RunningG1ClearCardTableTaskusing1workersfor1unitsofworkfor24regions.
[2.827s][debug][gc,ergo]GC(0)RunningG1FreeCollectionSetusing1workersforcollectionsetlength24
[2.828s][trace][gc,ergo,refine]GC(0)UpdatingRefinementZones:updaterstime:0.004ms,updatersbuffers:0,updaters
goaltime:19.999ms
[2.829s][debug][gc,ergo,refine]GC(0)UpdatedRefinementZones:green:23,yellow:69,red:115
[3.045s][trace][gc,ergo,set]GC(1)StartchoosingCSet.pendingcards:5898predictedbasetime:26.69msremaining
time:173.31mstargetpausetime:200.00ms
[3.045s][trace][gc,ergo,cset]GC(1)AddyoungregionstoSet.eden:9regions,survivors:3regions,predictedyoung
regiontime:457.38ms,targetpausetime:200.00ms
[3.045s][debug](gc,ergo,set]GC(1)FinishchoosingCSet.old:@regions,predictedoldregiontime:0.00ms,time
remaining:0.00
[3.090s][debug][gc,ergo
]GC(1)RunningG1ClearCardTableTaskusing1workersfor1unitsofworkfor12regions.
[3.091s][debug][gc,ergo
GC(1)RunningG1FreeCollectionSetusing1workersforcollectionsetlength12
[3.093s][trace][gc,ergo,refine]GC(1)UpdatingRefinementZones:updaterstime:2.510ms,updatersbuffers:25,updaters
goaltime:19.999ms
[3.093s][debug][gc,ergo,refine]GC(1)UpdatedRefinementZones:green:25,yellow:75,red:125

看一下這部分的源碼的變遷,就可以知道確實是如此了,在 Java8 中,PSYoungGen::resize_spaces代碼如下:

179dedd4-5b3e-11ed-a3b6-dac502259ad0.jpg

在 Java17 中,這部分日志打印被 gc+ergo 的標簽日志取代:

17aae3b8-5b3e-11ed-a3b6-dac502259ad0.jpg

還有一個分代 GC 中非常有用的參數 -XX:+PrintTenuringDistribution,現在被 gc+age=trace 取代

完整的參數變遷對應表如下:

17c35902-5b3e-11ed-a3b6-dac502259ad0.png17dd64dc-5b3e-11ed-a3b6-dac502259ad0.png18028df2-5b3e-11ed-a3b6-dac502259ad0.png18105270-5b3e-11ed-a3b6-dac502259ad0.png
舉例
-XX:+PrintGCDetails//gc*
-XX:+PrintGCApplicationStoppedTime//safepoint
-XX:+PrintGCApplicationConcurrentTime//safepoint
-XX:+PrintGCCause//默認會輸出
-XX:+PrintGCID//默認會輸出
-XX:+PrintTenuringDistribution//gc+age*=trace
-XX:+PrintGCDateStamps//:time,tags,level
-XX:+UseGCLogFileRotation//:filecount=5,filesize=10M
-XX:NumberOfGCLogFiles=5//:filecount=5,filesize=10M
-XX:GCLogFileSize=10M//:filecount=5,filesize=10M
-Xloggc:/var/log/`date+%FT%H-%M-%S`-gc.log//-Xlog::file=/var/log/%t-gc.log

變遷后:

-Xlog:
gc*,
safepoint,
gc+heap=debug,
gc+ergo*=trace,
gc+age*=trace,
:file=/var/log/%t-gc.log
:time,tags,level
:filecount=5,filesize=10M
推薦的配置
-Xlog:
//selections
codecache+sweep*=trace,
class+unload,//TraceClassUnloading
class+load,//TraceClassLoading
os+thread,
safepoint,//TraceSafepoint
gc*,//PrintGCDetails
gc+stringdedup=debug,//PrintStringDeduplicationStatistics
gc+ergo*=trace,
gc+age=trace,//PrintTenuringDistribution
gc+phases=trace,
gc+humongous=trace,
jit+compilation=debug
//output
:file=/path_to_logs/app.log
//decorators
:level,tags,time,uptime,pid
//output-options
:filesize=104857600,filecount=5

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://gitee.com/zhijiantianya/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

運行相關

反射+私有 API 調用之傷

在 Java8 中,沒有人能阻止你訪問特定的包,比如 sun.misc,對反射也沒有限制,只要 setAccessible(true) 就可以了。Java9 模塊化以后,一切都變了,只能通過 --add-exports--add-opens 來打破模塊封裝

  • --add-opens 導出特定的包
  • --add-opens 允許模塊中特定包的類路徑深度反射訪問

比如:

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

關于 GC 算法的選擇

CMS 正式退出歷史舞臺,G1 正式接棒,ZGC 蓄勢待發。在GC 算法的選擇上,目前來看 G1 還是最佳的選擇,ZGC 因為有內存占用被 OS 標記過高(三倍共享內存)虛高的問題,進程可能被 OOM-killer 殺掉。

ZGC 三倍 RES 內存

ZGC 底層用到了一個稱之為染色指針的技術,使用三個視圖(Marked0、Marked1 和 Remapped)來映射到同一塊共享內存區域,原理如下:

##include
##include
##include
##include
##include
##include
##include

intmain(){
//shm_open()函數用來打開或者創建一個共享內存區,兩個進程可以通過給shm_open()函數傳遞相同的名字以達到操作同一共享內存的目的
intfd=::shm_open("/test",O_RDWR|O_CREAT|O_EXCL,0600);
if(fd0){
shm_unlink("/test");
perror("shmopenfailed");
return0;
}

size_tsize=1*1024*1024*1024;
//創建一個共享內存后,默認大小為0,所以需要設置共享內存大小。ftruncate()函數可用來調整文件或者共享內存的大小
::ftruncate(fd,size);
intprot=PROT_READ|PROT_WRITE;
//創建共享內存后,需要將共享內存映射到調用進程的地址空間,可通過mmap()函數來完成
uint32_t*p1=(uint32_t*)(mmap(nullptr,size,prot,MAP_SHARED,fd,0));
uint32_t*p2=(uint32_t*)(mmap(nullptr,size,prot,MAP_SHARED,fd,0));
uint32_t*p3=(uint32_t*)(mmap(nullptr,size,prot,MAP_SHARED,fd,0));
::close(fd);
*p1=0xcafebabe;
::printf("Addressofaddr1:%p,valueis0x%x
",p1,*p1);
::printf("Addressofaddr2:%p,valueis0x%x
",p2,*p2);
::printf("Addressofaddr3:%p,valueis0x%x
",p3,*p3);
::getchar();
*p2=0xcafebaba;
::printf("Addressofaddr1:%p,valueis0x%x
",p1,*p1);
::printf("Addressofaddr2:%p,valueis0x%x
",p2,*p2);
::printf("Addressofaddr3:%p,valueis0x%x
",p3,*p3);
::getchar();
munmap(p1,size);
munmap(p2,size);
munmap(p3,size);
shm_unlink("/test");
std::cout<"hello"<std::endl;
}

你可以想象 p1、p2、p3 這三塊內存區域就是 ZGC 中三種視圖。

但是在 linux 統計中,雖然是共享內存,但是依然會統計三次,比如 RES。

同一個應用,使用 G1 RES 顯示占用 2G,ZGC 則顯示占用 6G

java-XX:+AlwaysPreTouch-Xms2G-Xmx2G-XX:+UseZGCMyTest
java-XX:+AlwaysPreTouch-Xms2G-Xmx2G-XX:+UseG1GCMyTest
181e2738-5b3e-11ed-a3b6-dac502259ad0.jpg

接下面我們討論的都是 G1 相關的。

G1 參數調整

不要配置新生代的大小

這個在《JVM G1 源碼分析和調優》一書里有詳細的介紹,有兩個主要的原因:

  • G1對內存的管理是不連續的,重新分配一個分區代價很低
  • G1 的需要根據目標停頓時間動態調整搜集的分區的個數,如果不能調整新生代的大小,那么 G1 可能不能滿足停頓時間的要求

諸如 -Xmn, -XX:NewSize, -XX:MaxNewSize, -XX:SurvivorRatio 都不要在 G1 中出現,只需要控制最大、最小堆和目標暫停時間即可

調整 -XX:InitiatingHeapOccupancyPercent 到合適的值

IHOP 默認值為 45,這個值是啟動并發標記的先決條件,只有當老年代內存棧總空間的 45% 之后才會啟動并發標記任務。

增加這個值:導致并發標記可能花費更多的時間,同時導致 YGC 和 Mixed-GC 收集時的分區數變少,可以根據整體應用占用的平均內存來設置。



審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2966

    瀏覽量

    104702
  • 編譯
    +關注

    關注

    0

    文章

    657

    瀏覽量

    32852
  • 遷移
    +關注

    關注

    0

    文章

    33

    瀏覽量

    7925

原文標題:從 Java 8 升級到 Java 17 全過程,賊特么坑!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Java 23功能介紹

    Java 23 包含全新和更新的 Java 語言功能、核心 API 以及 JVM,同時適合新的 Java 開發者和高級開發者。?IntelliJ IDEA 2024.2?開始已支持
    的頭像 發表于 12-04 10:02 ?193次閱讀
    <b class='flag-5'>Java</b> 23功能介紹

    Java集合API的改進介紹

    解答這些問題。 我們將逐步學習 Java 集合類的優化過程,并按版本逐一對比分析。主要討論的焦點將包括 JDK 1.0、1.2、1.4、1.5、1.6、1.8、9、10、11 和 21 版本的 Java 集合功能
    的頭像 發表于 11-22 11:12 ?175次閱讀
    <b class='flag-5'>Java</b>集合API的改進介紹

    ADS7813升級到ADS8513

    電子發燒友網站提供《ADS7813升級到ADS8513.pdf》資料免費下載
    發表于 10-21 09:59 ?0次下載
    <b class='flag-5'>從</b>ADS7813<b class='flag-5'>升級到</b>ADS8513

    java反編譯能拿到源碼嗎

    Java反編譯是一種將編譯后的Java字節碼(.class文件)轉換回Java源代碼的過程。雖然反編譯可以幫助理解代碼的邏輯和結構,但它并不總是能完美地還原原始源代碼。反編譯工具通常會
    的頭像 發表于 09-02 11:03 ?945次閱讀

    將Non-OS SDK1.3.0升級到1.4.0后,AT CWLAP命令將無法再找到我的AP,為什么?

    將Non-OS SDK1.3.0升級到1.4.0(AT版本0.40升級到0.50)后,AT CWLAP命令將無法再找到我的AP。它仍然會找到一些 AP,但不是我想使用的 AP,它在物理上最接近
    發表于 07-17 06:00

    華納云:java web和java有什么區別java web和java有什么區別

    的平臺,Java可以用于開發桌面應用程序、移動應用程序、企業應用程序等。 – Java Web是Java語言在Web開發領域的應用,它使用Java
    的頭像 發表于 07-16 13:35 ?785次閱讀
    華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區別

    JDK8升級JDK11最全實踐干貨來了

    應用程序的運行速度。綜合評估,Java 8 升級到 Java 11,G1GC平均速度提升16.1%,ParallelGC為4.5%(基于O
    的頭像 發表于 06-25 14:51 ?428次閱讀
    JDK<b class='flag-5'>8</b><b class='flag-5'>升級</b>JDK11最全實踐干貨來了

    JDK11升級JDK17最全實踐干貨來了

    解決你的問題。 上篇文章給大家帶來了JDK8升級JDK11的最全實踐,相信大家閱讀后已經對JDK11有了比較深入的了解。2021年9月14日,Oracle發布了可以長期支持的JDK17版本,那么
    的頭像 發表于 06-25 14:50 ?721次閱讀
    JDK11<b class='flag-5'>升級</b>JDK<b class='flag-5'>17</b>最全實踐干貨來了

    精準毫米:H9激光切管機鋁材切割與打孔全過程解析

    H9激光切管機在鋁材切割與打孔的全過程包括設定參數、啟動切割、監控質量、完成取件和檢查效果等。H9激光切管機鋁材切割與打孔的全過程可以詳細解析如下:一、操作準備檢查H9激光切管機各部件是否齊全,并
    的頭像 發表于 06-20 11:14 ?664次閱讀
    精準<b class='flag-5'>到</b>毫米:H9激光切管機鋁材切割與打孔<b class='flag-5'>全過程</b>解析

    VSCode使用ESP-IDF插件1.50升級到1.5.1之后Monitor快捷鍵命令報錯怎么解決?

    系統環境:Win7 IDF版本:V4.2.1 VSCode版本:1.70.1 硬件芯片:ESP32-PICO-D4 問題描述: 1.ESP-IDF插件升級到1.5.1之后Monitor快捷鍵命令報錯,報錯日志如下 2.回滾到1.5.0版本后功能正常,日志如下:
    發表于 06-13 06:54

    如何將stm32f207的以太網庫中lwip1.3.2升級到1.4.1?

    如何將stm32f207的以太網庫中lwip1.3.2升級到1.4.1
    發表于 05-17 08:04

    已經安裝了Java,且依然提示安裝Java是為什么?

    我已經在機器上安裝了最新版的 Java 10,打開 Cube 卻得到要求安裝 Java 1.7.0_45 的提示。何解?Eclipse CDT 依賴 Java,不可卸載重裝。
    發表于 04-26 06:23

    STM32CubeMX版本升級由6.2.1升級到6.3.0后原工程重新編譯code文件變大什么原因?

    STM32CubeMX版本升級由6.2.1升級到6.3.0后原工程重新編譯code文件變大什么原因
    發表于 04-02 07:31

    永磁同步電機全速域矢量控制的全過程介紹

    一直都想知道永磁同步電機的轉速零增加到極限這個過程會發生什么,這篇文章介紹一下永磁同步電機全速域矢量控制的全過程,即電機的轉速從零開始逐漸增加,如何設計電流環電流使得電機輸出恒定轉矩,且保持轉速穩定。
    的頭像 發表于 03-15 09:29 ?1305次閱讀
    永磁同步電機全速域矢量控制的<b class='flag-5'>全過程</b>介紹

    XMC Pinout Tool是否可以不受限制地使用免費的Java版本運行?

    我有幾個關于 XMC 引腳排列工具的問題。 首先我想問一下 XMC Pinout Tool 是否可以不受限制地使用免費的 Java 版本(Oracle Java SE v17 LTS)運行? 其次
    發表于 01-22 06:18
    主站蜘蛛池模板: 我们中文在线观看免费完整版 | 三级网站视频| 一个人免费观看在线视频播放| 91成品视频| 国产三区在线成人AV| 男人大臿蕉香蕉大视频| 色狠狠一区二区| 99精品国产福利在线观看| 国厂精品114福利电影| 青青精品国产自在线拍| 一个人看的www视频动漫版| 国产成人无码精品久久久影院 | 国产精品成人影院| 麻豆婷婷狠狠色18禁久久| 亚洲国产精品高清在线| 公和熄洗澡三级中文字幕| 男男腐文污高干嗯啊快点1V1| 亚洲精品免费观看| 国产成人a在一区线观看高清| 琪琪伦伦影院理论片| aaa在线观看视频高清视频| 久久伊人在| 亚洲永久精品ww47app| 国产1000部成人免费视频| 狼群影院视频在线观看WWW| 亚洲AV国产精品无码精| 儿媳妇完整版视频播放免费观看| 伦理片92伦理午夜| 野花社区WWW韩国日本| 精品国产mmd在线观看| 亚洲熟妇色自偷自拍另类| 国产麻豆精品久久一二三| 日本午夜看x费免| bt天堂午夜国产精品| 免费成年人在线视频| 1300部真实小Y女视频合集| 久久精品视频15人人爱在线直播| 亚洲免费每日在线观看| 久久99热这里只频精品6| 樱桃视频高清免费观看在线播放| 老妇xxxxbbbb|