看完java12新特性血崭,是否該拋棄java1.7和1.8了?

概覽

Java 12 已如期于 3 月 19 日正式發(fā)布厘灼,此次更新是 Java 11 這一長(zhǎng)期支持版本發(fā)布之后的一次常規(guī)更新夹纫,截至目前,Java 半年為發(fā)布周期设凹,并且不會(huì)跳票承諾的發(fā)布模式舰讹,已經(jīng)成功運(yùn)行一年多了。通過這樣的方式闪朱,Java 開發(fā)團(tuán)隊(duì)能夠?qū)⒁恍┲匾匦员M早的合并到 Java Release 版本中月匣,以便快速得到開發(fā)者的反饋钻洒,避免出現(xiàn)類似 Java 9 發(fā)布時(shí)的兩次延期的情況。

Java 12 早在 2018 年 12 月便進(jìn)入了 Rampdown Phase One 階段锄开,這意味著該版本所有新的功能特性被凍結(jié)素标,不會(huì)再加入更多的 JEP。該階段將持續(xù)大概一個(gè)月院刁,主要修復(fù) P1-P3 級(jí)錯(cuò)誤糯钙。主要時(shí)間節(jié)點(diǎn)如下:

2018-12-13 Rampdown 第一階段 ( 從主線分離 )
2019-01-17 Rampdown 第二階段
2019-02-07 發(fā)布候選階段
2019-03-19 正式發(fā)布
本文主要針對(duì) Java 12 中的新特性展開介紹,讓您快速了解 Java 12 帶來的變化退腥。

一個(gè)低停頓垃圾收集器(實(shí)驗(yàn)階段)

Java 12 中引入一個(gè)新的垃圾收集器:Shenandoah任岸,它是作為一中低停頓時(shí)間的垃圾收集器而引入到 Java 12 中的,其工作原理是通過與 Java 應(yīng)用程序中的執(zhí)行線程同時(shí)運(yùn)行狡刘,用以執(zhí)行其垃圾收集享潜、內(nèi)存回收任務(wù),通過這種運(yùn)行方式嗅蔬,給虛擬機(jī)帶來短暫的停頓時(shí)間剑按。

Shenandoah 垃圾回收器是 Red Hat 在 2014 年宣布進(jìn)行的一項(xiàng)垃圾收集器研究項(xiàng)目,旨在針對(duì) JVM 上的內(nèi)存收回實(shí)現(xiàn)低停頓的需求澜术。該設(shè)計(jì)將與應(yīng)用程序線程并發(fā)艺蝴,通過交換 CPU 并發(fā)周期和空間以改善停頓時(shí)間,使得垃圾回收器執(zhí)行線程能夠在 Java 線程運(yùn)行時(shí)進(jìn)行堆壓縮鸟废,并且標(biāo)記和整理能夠同時(shí)進(jìn)行猜敢,因此避免了在大多數(shù) JVM 垃圾收集器中所遇到的問題。

據(jù) Red Hat 研發(fā) Shenandoah 團(tuán)隊(duì)對(duì)外宣稱盒延,Shenandoah 垃圾回收器的暫停時(shí)間與堆大小無關(guān)缩擂,這意味著無論將堆設(shè)置為 200 MB 還是 200 GB,都將擁有一致的系統(tǒng)暫停時(shí)間添寺,不過實(shí)際使用性能將取決于實(shí)際工作堆的大小和工作負(fù)載胯盯。

圖 1. Shenandoah GC 工作周期如下所示


在這里插入圖片描述

上圖對(duì)應(yīng)工作周期如下:

Init Mark 啟動(dòng)并發(fā)標(biāo)記 階段
并發(fā)標(biāo)記遍歷堆階段
并發(fā)標(biāo)記完成階段
并發(fā)整理回收無活動(dòng)區(qū)域階段
并發(fā) Evacuation 整理內(nèi)存區(qū)域階段
Init Update Refs 更新引用初始化 階段
并發(fā)更新引用階段
Final Update Refs 完成引用更新階段
并發(fā)回收無引用區(qū)域階段
需要了解不是唯有 GC 停頓可能導(dǎo)致常規(guī)應(yīng)用程序響應(yīng)時(shí)間比較長(zhǎng)。具有較長(zhǎng)的 GC 停頓時(shí)間會(huì)導(dǎo)致系統(tǒng)響應(yīng)慢的問題计露,但響應(yīng)時(shí)間慢并非一定是 GC 停頓時(shí)間長(zhǎng)導(dǎo)致的博脑,隊(duì)列延遲、網(wǎng)絡(luò)延遲票罐、其他依賴服務(wù)延遲和操作提供調(diào)度程序抖動(dòng)等都可能導(dǎo)致響應(yīng)變慢叉趣。使用 Shenandoah 時(shí)需要全面了解系統(tǒng)運(yùn)行情況,綜合分析系統(tǒng)響應(yīng)時(shí)間胶坠。各種 GC 工作負(fù)載對(duì)比如下所示:
圖 2. 各種 GC 工作負(fù)載對(duì)比


在這里插入圖片描述

下面推薦幾個(gè)配置或調(diào)試 Shenandoah 的 JVM 參數(shù):

  • -XX:+AlwaysPreTouch:使用所有可用的內(nèi)存分頁君账,減少系統(tǒng)運(yùn)行停頓繁堡,為避免運(yùn)行時(shí)性能損失沈善。
  • -Xmx == -Xmsv:設(shè)置初始堆大小與最大值一致乡数,可以減輕伸縮堆大小帶來的壓力,與 AlwaysPreTouch 參數(shù)配合使用闻牡,在啟動(dòng)時(shí)提交所有內(nèi)存净赴,避免在最終使用中出現(xiàn)系統(tǒng)停頓。
  • -XX:+ UseTransparentHugePages:能夠大大提高大堆的性能罩润,同時(shí)建議在 Linux 上使用時(shí)將 /sys/kernel/mm/transparent_hugepage/enabled 和
    /sys/kernel/mm/transparent_hugepage/defragv 設(shè)置為:madvise玖翅,同時(shí)與
    AlwaysPreTouch 一起使用時(shí),init 和 shutdownv 速度會(huì)更快割以,因?yàn)樗鼘⑹褂酶蟮捻撁孢M(jìn)行預(yù)處理金度。
  • -XX:+UseNUMA:雖然 Shenandoah 尚未明確支持 NUMA(Non-Uniform Memory Access),但最好啟用此功能以在多插槽主機(jī)上啟用 NUMA 交錯(cuò)严沥。與 AlwaysPreTouch
    相結(jié)合猜极,它提供了比默認(rèn)配置更好的性能。
  • -XX:+DisableExplicitGC:忽略代碼中的 System.gc() 調(diào)用消玄。當(dāng)用戶在代碼中調(diào)用 System.gc() 時(shí)會(huì)強(qiáng)制 Shenandoah 執(zhí)行 STW Full GC 跟伏,應(yīng)禁用它以防止執(zhí)行此操作,另外還可以使用
    -XX:+ExplicitGCInvokesConcurrent翩瓜,在 調(diào)用 System.gc() 時(shí)執(zhí)行 CMS GC 而不是 Full GC受扳,建議在有 System.gc() 調(diào)用的情況下使用。

不過目前 Shenandoah 垃圾回收器還被標(biāo)記為實(shí)驗(yàn)項(xiàng)目兔跌,需要使用參數(shù):- XX:+UnlockExperimentalVMOptions 啟用勘高。更多有關(guān)如何配置、調(diào)試 Shenandoah 的信息浮定,請(qǐng)參閱 henandoah wiki相满。

增加一套微基準(zhǔn)套件

Java 12 中添加一套新的基本的微基準(zhǔn)測(cè)試套件,該套微基準(zhǔn)測(cè)試套件基于 JMH(Java Microbenchmark Harness)桦卒,使開發(fā)人員可以輕松運(yùn)行現(xiàn)有的微基準(zhǔn)測(cè)試并創(chuàng)建新的基準(zhǔn)測(cè)試立美,其目標(biāo)在于提供一個(gè)穩(wěn)定且優(yōu)化過的基準(zhǔn),其中包括將近 100 個(gè)基準(zhǔn)測(cè)試的初始集合方灾,并且能夠輕松添加新基準(zhǔn)建蹄、更新基準(zhǔn)測(cè)試和提高查找已有基準(zhǔn)測(cè)試的便利性。

微基準(zhǔn)套件與 JDK 源代碼位于同一個(gè)目錄中裕偿,并且在構(gòu)建后將生成單個(gè) Jar 文件洞慎。但它是一個(gè)單獨(dú)的項(xiàng)目,在支持構(gòu)建期間不會(huì)執(zhí)行嘿棘,以方便開發(fā)人員和其他對(duì)構(gòu)建微基準(zhǔn)套件不感興趣的人在構(gòu)建時(shí)花費(fèi)比較少的構(gòu)建時(shí)間劲腿。

要構(gòu)建微基準(zhǔn)套件,用戶需要運(yùn)行命令:make build-microbenchmark鸟妙,類似的命令還有:make test TEST="micro:java.lang.invoke" 將使用默認(rèn)設(shè)置運(yùn)行 java.lang.invoke 相關(guān)的微基準(zhǔn)測(cè)試焦人。關(guān)于配置本地環(huán)境可以參照文檔 docs/testing.md|html挥吵。

Switch 表達(dá)式擴(kuò)展(預(yù)覽功能)

Java 11 以及之前 Java 版本中的 Switch 語句是按照類似 C、C++ 這樣的語言來設(shè)計(jì)的花椭,在默認(rèn)情況下支持 fall-through 語法忽匈。雖然這種傳統(tǒng)的控制流通常用于編寫低級(jí)代碼,但 Switch 控制語句通常運(yùn)用在高級(jí)別語言環(huán)境下的矿辽,因此其容易出錯(cuò)性掩蓋其靈活性丹允。

在 Java 12 中重新拓展了 Switch 讓它具備了新的能力,通過擴(kuò)展現(xiàn)有的 Switch 語句袋倔,可將其作為增強(qiáng)版的 Switch 語句或稱為 "Switch 表達(dá)式"來寫出更加簡(jiǎn)化的代碼雕蔽。

Switch 表達(dá)式也是作為預(yù)覽語言功能的第一個(gè)語言改動(dòng)被引入新版 Java 中來的,預(yù)覽語言功能的想法是在 2018 年初被引入 Java 中的宾娜,本質(zhì)上講萎羔,這是一種引入新特性的測(cè)試版的方法。通過這種方式碳默,能夠根據(jù)用戶反饋進(jìn)行升級(jí)贾陷、更改,在極端情況下嘱根,如果沒有被很好的接納髓废,則可以完全刪除該功能。預(yù)覽功能的關(guān)鍵在于它們沒有被包含在 Java SE 規(guī)范中该抒。

在 Java 11 以及之前版本中傳統(tǒng)形式的 Switch 語句寫法如下:

清單 1. Switch 語句示例

int dayNumber;
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        dayNumber = 6;
        break;
    case TUESDAY:
        dayNumber = 7;
        break;
    case THURSDAY:
    case SATURDAY:
        dayNumber = 8;
        break;
    case WEDNESDAY:
        dayNumber = 9;
        break;
    default:
        throw new IllegalStateException("Huh? " + day);
}

上面代碼中多處出現(xiàn) break 語句慌洪,顯得代碼比較冗余,同時(shí)如果某處漏寫一段 break 語句凑保,將導(dǎo)致程序一直向下穿透執(zhí)行的邏輯錯(cuò)誤冈爹,出現(xiàn)異常結(jié)果,同時(shí)這種寫法比較繁瑣欧引,也容易出問題频伤。

換做 Java 12 中的 Switch 表達(dá)式,上述語句寫法如下:

清單 2. Switch 表達(dá)式示例

int dayNumber = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
    default                      -> throw new IllegalStateException("Huh? " + day);
}

使用 Java 12 中 Switch 表達(dá)式的寫法芝此,省去了 break 語句憋肖,避免了因少些 break 而出錯(cuò),同時(shí)將多個(gè) case 合并到一行婚苹,顯得簡(jiǎn)潔岸更、清晰也更加優(yōu)雅的表達(dá)邏輯分支,其具體寫法就是將之前的 case 語句表成了:case L ->膊升,即如果條件匹配 case L怎炊,則執(zhí)行 標(biāo)簽右側(cè)的代碼 ,同時(shí)標(biāo)簽右側(cè)的代碼段只能是表達(dá)式、代碼塊或 throw 語句评肆。為了保持兼容性赞咙,case 條件語句中依然可以使用字符 : ,這時(shí) fall-through 規(guī)則依然有效的糟港,即不能省略原有的 break 語句,但是同一個(gè) Switch 結(jié)構(gòu)里不能混用 -> 和 : 院仿,否則會(huì)有編譯錯(cuò)誤秸抚。并且簡(jiǎn)化后的 Switch 代碼塊中定義的局部變量,其作用域就限制在代碼塊中歹垫,而不是蔓延到整個(gè) Switch 結(jié)構(gòu)剥汤,也不用根據(jù)不同的判斷條件來給變量賦值。

Java 11 以及之前版本中排惨,Switch 表達(dá)式支持下面類型: byte吭敢、char、short暮芭、int鹿驼、Byte、Character辕宏、Short畜晰、Integer、enum瑞筐、tring凄鼻,在未來的某個(gè) Java 版本有可能會(huì)允許支持 float、double 和 long (以及上面類型的封裝類型)聚假。

引入 JVM 常量 API

Java 12 中引入 JVM 常量 API块蚌,用來更容易地對(duì)關(guān)鍵類文件 (key class-file) 和運(yùn)行時(shí)構(gòu)件(artefact)的名義描述 (nominal description) 進(jìn)行建模,特別是對(duì)那些從常量池加載的常量膘格,這是一項(xiàng)非常技術(shù)性的變化峭范,能夠以更簡(jiǎn)單、標(biāo)準(zhǔn)的方式處理可加載常量瘪贱。

此項(xiàng)改進(jìn)主要在新的 java.lang.invoke.constant 包中定義了一系列基于值的符號(hào)引用類型虎敦,能夠描述每種可加載常量。符號(hào)引用以純粹 nominal 的形式描述可加載常量政敢,與類加載或可訪問 性上下文分開其徙。同時(shí)有些類可以作為自己的符號(hào)引用(例如 String),而對(duì)于可鏈接常量喷户,另外定義了一系列符號(hào)引用類型唾那,具體包括: ClassDesc (Class 的可加載常量標(biāo)稱描述符) ,MethodTypeDesc(方法類型常量標(biāo)稱描述符) ,MethodHandleDesc (方法句柄常量標(biāo)稱描述符) 和 DynamicConstantDesc (動(dòng)態(tài)常量標(biāo)稱描述符) 闹获,它們包含描述這些常量的 nominal 信息期犬。

改進(jìn) AArch64 實(shí)現(xiàn)

Java 12 中將只保留一套 AArch64 實(shí)現(xiàn),刪除所有與 arm64 實(shí)現(xiàn)相關(guān)的代碼避诽,只保留 32 位 ARM 端口和 64 位 aarch64 的端口龟虎。刪除此套實(shí)現(xiàn)將允許所有開發(fā)人員將目標(biāo)集中在剩下的這個(gè) 64 位 ARM 實(shí)現(xiàn)上,消除維護(hù)兩套端口所需的重復(fù)工作沙庐。

當(dāng)前 Java 11 中存在兩套 64 位 AArch64 端口鲤妥,它們主要存在于 src/hotspot/cpu/arm 和 open/src/hotspot/cpu/aarch64 目錄中。這兩套代碼中都實(shí)現(xiàn)了 AArch64拱雏,Java 12 中將刪除目錄 open/src/hotspot/cpu/arm 中關(guān)于 64-bit 的這套實(shí)現(xiàn)棉安,只保留其中有關(guān) 32-bit 的實(shí)現(xiàn),余下目錄的 open/src/hotspot/cpu/aarch64 代碼部分就成了 AArch64 的默認(rèn)實(shí)現(xiàn)铸抑。

使用默認(rèn)類數(shù)據(jù)共享(CDS)存檔

類數(shù)據(jù)共享機(jī)制 (Class Data Sharing 贡耽,簡(jiǎn)稱 CDS) ,允許將一組類預(yù)處理為共享歸檔文件鹊汛,以便在運(yùn)行時(shí)能夠進(jìn)行內(nèi)存映射以減少 Java 程序的啟動(dòng)時(shí)間蒲赂,當(dāng)多個(gè) Java 虛擬機(jī)(JVM)共享相同的歸檔文件時(shí),還可以減少動(dòng)態(tài)內(nèi)存的占用量刁憋,同時(shí)減少多個(gè)虛擬機(jī)在同一個(gè)物理或虛擬的機(jī)器上運(yùn)行時(shí)的資源占用凳宙。

自 Java 8 以來,在基本 CDS 功能上進(jìn)行了許多增強(qiáng)职祷、改進(jìn)氏涩,啟用 CDS 后應(yīng)用的啟動(dòng)時(shí)間和內(nèi)存占用量顯著減少。使用 Java 11 早期版本在 64 位 Linux 平臺(tái)上運(yùn)行 HelloWorld 進(jìn)行測(cè)試有梆,測(cè)試結(jié)果顯示啟動(dòng)時(shí)間縮短有 32 %是尖,同時(shí)在其他 64 位平臺(tái)上,也有類似或更高的啟動(dòng)性能提升泥耀。

Java 12 針對(duì) 64 位平臺(tái)下的 JDK 構(gòu)建過程進(jìn)行了增強(qiáng)改進(jìn)饺汹,使其默認(rèn)生成類數(shù)據(jù)共享(CDS)歸檔,以進(jìn)一步達(dá)到改進(jìn)應(yīng)用程序的啟動(dòng)時(shí)間的目的痰催,同時(shí)也避免了需要手動(dòng)運(yùn)行:-Xshare:dump 的需要兜辞,修改后的 JDK 將在 lib/server 目錄中保留構(gòu)建時(shí)生成的 CDS 存檔。

當(dāng)然如果需要夸溶,也可以添加其他 GC 參數(shù)逸吵,來調(diào)整堆大小等,以獲得更優(yōu)的內(nèi)存分布情況缝裁,同時(shí)用戶也可以像之前一樣創(chuàng)建自定義的 CDS 存檔文件扫皱。

改善 G1 垃圾收集器,使其能夠中止混合集合

G1 是垃圾收集器,設(shè)計(jì)用于具有大量?jī)?nèi)存的多處理器機(jī)器韩脑,提高了垃圾回收效率氢妈。該垃圾收集器 設(shè)計(jì)的主要目標(biāo)之一是滿足用戶設(shè)置的預(yù)期的 JVM 停頓時(shí)間,G1 采用一個(gè)高級(jí)分析引擎來選擇在收集期間要處理的工作量段多,此選擇過程的結(jié)果是一組稱為 GC 回收集的區(qū)域首量。一旦收集器確定了 GC 回收集 并且 GC 回收、整理工作已經(jīng)開始进苍,則 G1 收集器必須完成收集集合集的所有區(qū)域中的所有活動(dòng)對(duì)象之后才能停止加缘;但是如果收集器選擇過大的 GC 回收集,可能會(huì)導(dǎo)致 G1 回收器停頓時(shí)間超過預(yù)期時(shí)間琅捏。

Java 12 中將把 GC 回收集(混合收集集合)拆分為必需和可選兩部分,使 G1 垃圾回收器能中止垃圾回收過程递雀。其中必需處理的部分包括 G1 垃圾收集器不能遞增處理的 GC 回收集的部分(如:年輕代)柄延,同時(shí)也可以包含老年代以提高處理效率。將 GC 回收集拆分為必需和可選部分時(shí)缀程,需要為可選 GC 回收集部分維護(hù)一些其他數(shù)據(jù)搜吧,這會(huì)產(chǎn)生輕微的 CPU 開銷,但小于 1 %的變化杨凑,同時(shí)在 G1 回收器處理 GC 回收集期間滤奈,本機(jī)內(nèi)存使用率也可能會(huì)增加,使用上述情況只適用于包含可選 GC 回收部分的 GC 混合回收集合撩满。

在 G1 垃圾回收器完成收集需要必需回收的部分之后蜒程,便開始收集可選的部分,如果還有時(shí)間的話伺帘,但是粗粒度的處理昭躺,可選部分的處理粒度取決于剩余的時(shí)間,一次只能處理可選部分的一個(gè)子集區(qū)域伪嫁。在完成可選收集部分的收集后领炫,G1 垃圾回收器可以根據(jù)剩余時(shí)間決定是否停止收集。如果在處理完 必需處理的 部分后张咳,屬于時(shí)間不足帝洪,總時(shí)間花銷接近預(yù)期時(shí)間,G1 垃圾回收器也可以中止可選部分的回收以達(dá)到滿足預(yù)期停頓時(shí)間的目標(biāo)脚猾。

增強(qiáng) G1 垃圾收集器葱峡,使其能自動(dòng)返回未用堆內(nèi)存給操作系統(tǒng)

上節(jié)中介紹了 Java 12 中增強(qiáng)了 G1 垃圾收集器關(guān)于混合收集集合的處理策略,這節(jié)主要介紹在 Java 12 中同時(shí)也對(duì) G1 垃圾回收器進(jìn)行了改進(jìn)龙助,使其能夠在空閑時(shí)自動(dòng)將 Java 堆內(nèi)存返還給操作系統(tǒng)族沃,這也是 Java 12 中的另外一項(xiàng)重大改進(jìn)。

目前 Java 11 版本中包含的 G1 垃圾收集器 暫時(shí)無法及時(shí)將已提交的 Java 堆內(nèi)存返回給操作系統(tǒng), G1 垃圾收集器僅在進(jìn)行完整 GC (Full GC) 或并發(fā)處理周期時(shí)才能將 Java 堆返回內(nèi)存脆淹。由于 G1 回收器盡可能避免完整 GC常空,并且只觸發(fā)基于 Java 堆占用和分配活動(dòng)的并發(fā)周期,因此在許多情況下 G 1 垃圾回收器不能回收 Java 堆內(nèi)存盖溺,除非有外部強(qiáng)制執(zhí)行购岗。

在使用云平臺(tái)的容器環(huán)境中,這種不利之處特別明顯横殴。即使在虛擬機(jī)不活動(dòng)尚粘,但如果仍然使用其分配的內(nèi)存資源,哪怕是其中的一小部分蝇庭,G1 回收器也仍將保留所有已分配的 Java 堆內(nèi)存醉鳖。而這將導(dǎo)致用戶需要始終為所有資源付費(fèi),哪怕是實(shí)際并未用到哮内,而云提供商也無法充分利用其硬件盗棵。如果在次期間虛擬機(jī)能夠檢測(cè)到 Java 堆內(nèi)存的實(shí)際使用情況,并在利用空閑時(shí)間自動(dòng)將 Java 堆內(nèi)存返還北发,則兩者都將受益纹因。

為了盡可能的向操作系統(tǒng)返回空閑內(nèi)存,G1 垃圾收集器將在應(yīng)用程序不活動(dòng)期間定期生成或持續(xù)循環(huán)檢查整體 Java 堆使用情況琳拨,以便 G 1 垃圾收集器能夠更及時(shí)的將 Java 堆中不使用內(nèi)存部分返還給操作系統(tǒng)瞭恰。對(duì)于長(zhǎng)時(shí)間處于空閑狀態(tài)的應(yīng)用程序,此項(xiàng)改進(jìn)將使 JVM 的內(nèi)存利用率更加高效狱庇。

如果應(yīng)用程序?yàn)榉腔顒?dòng)狀態(tài)惊畏,在下面兩種情況下,G1 回收器會(huì)觸發(fā)定期垃圾收集:

自上次垃圾回收完成 以來已超過 G1PeriodicGCInterva l 毫秒密任, 并且此時(shí)沒有正在進(jìn)行的垃圾回收任務(wù)陕截。如果 G1PeriodicGCInterval 值為零表示禁用快速回收內(nèi)存的定期垃圾收集。
應(yīng)用所在主機(jī)系統(tǒng)上執(zhí)行方法 getloadavg()批什,一分鐘內(nèi)系統(tǒng)返回的平均負(fù)載值低于 G1PeriodicGCSystemLoadThreshold农曲。如果 G1PeriodicGCSystemLoadThreshold 值為零,則此條件不生效驻债。
如果不滿足上述條件中的任何一個(gè)乳规,則取消當(dāng)期的定期垃圾回收。等一個(gè) G1PeriodicGCInterval 時(shí)間周期后合呐,將重新考慮是否執(zhí)行定期垃圾回收暮的。

G1 定期垃圾收集的類型根據(jù) G1PeriodicGCInvokesConcurrent 參數(shù)的值確定:如果設(shè)置值了,G1 垃圾回收器將繼續(xù)上一個(gè)或者啟動(dòng)一個(gè)新并發(fā)周期淌实;如果沒有設(shè)置值冻辩,則 G1 回收器將執(zhí)行一個(gè)完整的 GC猖腕。在每次一次 GC 回收末尾,G1 回收器將調(diào)整當(dāng)前的 Java 堆大小恨闪,此時(shí)便有可能會(huì)將未使用內(nèi)存返還給操作系統(tǒng)倘感。新的 Java 堆內(nèi)存大小根據(jù)現(xiàn)有配置確定,具體包括下列配置:- XX:MinHeapFreeRatio咙咽、-XX:MaxHeapFreeRatio老玛、-Xms、-Xmx钧敞。

默認(rèn)情況下蜡豹,G1 回收器在定期垃圾回收期間新啟動(dòng)或繼續(xù)上一輪并發(fā)周期,將最大限度地減少應(yīng)用程序的中斷溉苛。如果定期垃圾收集嚴(yán)重影響程序執(zhí)行镜廉,則需要考慮整個(gè)系統(tǒng) CPU 負(fù)載,或讓用戶禁用定期垃圾收集愚战。

結(jié)束語

自上次 Java 11 發(fā)布后娇唯,很快我們又迎來了 Java 12 版本的更新。Java 12 版本雖然是非 LTS 版本凤巨,但是這次更新也帶來了不少 JVM视乐、GC 功能增強(qiáng)洛搀、改進(jìn)敢茁,本文主要針對(duì)其中幾個(gè)影響重大變化以及主要的特性做了介紹。Java 12 已經(jīng)來了留美,還跟得上更新的節(jié)奏嗎彰檬?

本文只是個(gè)人的一點(diǎn)思考,僅代表個(gè)人觀點(diǎn)谎砾,不代表作者所在單位的意見逢倍,如有不足之處,還望各位讀者能夠海涵景图,如可以较雕,希望讀者們能夠反饋意見,交流心得挚币,一同進(jìn)步亮蒋。

參考資源

參考 JDK 12,查看更多有關(guān) Java 12 的最新信息妆毕。
參考 Shenandoah wiki page慎玖,查看更多有關(guān) Shenandoah 的最新信息。
參考 Java 11 新特性介紹

作者:李 林鋒
來源:https://www.ibm.com/developerworks/cn/java/the-new-features-of-Java-12/index.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笛粘,一起剝皮案震驚了整個(gè)濱河市趁怔,隨后出現(xiàn)的幾起案子湿硝,更是在濱河造成了極大的恐慌,老刑警劉巖润努,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件关斜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡任连,警方通過查閱死者的電腦和手機(jī)蚤吹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來随抠,“玉大人裁着,你說我怎么就攤上這事」八” “怎么了二驰?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)秉沼。 經(jīng)常有香客問我桶雀,道長(zhǎng),這世上最難降的妖魔是什么唬复? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任矗积,我火速辦了婚禮,結(jié)果婚禮上敞咧,老公的妹妹穿的比我還像新娘棘捣。我一直安慰自己,他們只是感情好休建,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布乍恐。 她就那樣靜靜地躺著,像睡著了一般测砂。 火紅的嫁衣襯著肌膚如雪茵烈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天砌些,我揣著相機(jī)與錄音呜投,去河邊找鬼。 笑死存璃,一個(gè)胖子當(dāng)著我的面吹牛仑荐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播有巧,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼释漆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了篮迎?” 一聲冷哼從身側(cè)響起男图,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤示姿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后逊笆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栈戳,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年难裆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了子檀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡乃戈,死狀恐怖褂痰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情症虑,我是刑警寧澤缩歪,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站谍憔,受9級(jí)特大地震影響匪蝙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜习贫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一逛球、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苫昌,春花似錦颤绕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涕烧。三九已至月而,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間议纯,已是汗流浹背父款。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞻凤,地道東北人憨攒。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像阀参,于是被迫代替她去往敵國和親肝集。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容