官术网_书友最值得收藏!

1.1 Java發(fā)展概述

Java平臺(tái)和語(yǔ)言最開始是SUN公司在1990年12月進(jìn)行的一個(gè)內(nèi)部研究項(xiàng)目,我們通常所說的Java一般泛指JDK(Java Developer Kit),它既包含了Java語(yǔ)言和開發(fā)工具,也包含了執(zhí)行Java的虛擬機(jī)(Java Virtual Machine,JVM)。從1996年1月23日開始,JDK 1.0版本正式發(fā)布,到如今Java已經(jīng)經(jīng)歷了23個(gè)春秋。以下是Java發(fā)展歷程中值得紀(jì)念的幾個(gè)時(shí)間點(diǎn):

·1998年12月4日J(rèn)DK迎來了一個(gè)里程碑版本1.2。其技術(shù)體系被分為三個(gè)方向,J2SE、J2EE、J2ME。代表技術(shù)包括EJB、Java Plug-in、Swing;虛擬機(jī)第一次內(nèi)置了JIT編譯器;語(yǔ)言上引入了Collections集合類等。

·2000年5月8日,JDK1.3發(fā)布。在該版本中Hotspot正式成為默認(rèn)的虛擬機(jī),Hotspot是1997年SUN公司收購(gòu)LongView Technologies公司而獲得的。

·2002年2月13日,JDK1.4發(fā)布。該版本是Java走向成熟的一個(gè)版本。從此之后,每一個(gè)新的版本都會(huì)增加新的特性,比如JDK5改進(jìn)了內(nèi)存模型、支持泛型等;JDK6增強(qiáng)了鎖同步等;JDK7正式支持G1垃圾回收、升級(jí)類加載的架構(gòu)等;JDK8支持函數(shù)式編程等。

·2006年11月13日的JavaOne大會(huì)上,SUN公司宣布最終會(huì)把Java開源,由OpenJDK組織對(duì)這些源碼獨(dú)立管理,從此之后Java程序員多了一個(gè)研究JVM的官方渠道。

·2009年4月20日,Oracle公司宣布正式以74億美元的價(jià)格收購(gòu)SUN公司,Java商標(biāo)從此正式歸Oracle所有,自此Oracle對(duì)Java的管理和發(fā)布進(jìn)入了一個(gè)新的時(shí)期。

隨著時(shí)間的推移,JDK 9和JDK 10也已經(jīng)正式發(fā)布,但是JDK 9和JDK 10并不是Oracle長(zhǎng)期支持的版本(Long Term Support),這意味著JDK 9和JDK 10只是JDK 11的一個(gè)過渡版本,它們只用于整合新的特性,當(dāng)下一個(gè)版本發(fā)布之后,這些過渡版本將不再更新維護(hù)。2018年9月25日J(rèn)DK 11正式發(fā)布,隨著新版本的發(fā)布,Oracle公司未來對(duì)JDK的支持也會(huì)變化。按照現(xiàn)在的聲明,從2019年1月起對(duì)于商業(yè)用戶,Oracle公司對(duì)JDK 8不再提供公共的更新,從2020年12月起對(duì)個(gè)人用戶也不再提供公共的更新。

G1作為CMS的替代者,一直吸引著眾多Java開發(fā)者的目光,自從JDK 7正式推出以來,G1不斷地增強(qiáng),并從JDK 8開始越來越成熟,在JDK 9、JDK 10、JDK 11中都成為默認(rèn)的垃圾回收器。實(shí)際上也有越來越多的公司開始在生產(chǎn)環(huán)境中使用G1作為垃圾回收器,有一篇文章描述了JDK 9中GC的基準(zhǔn)測(cè)試(benchmark),表明G1已經(jīng)優(yōu)于其他的GC http://blog.mgm-tp.com/2018/01/g1-mature-in-java9。可以預(yù)見隨著JDK 11的推出,會(huì)有越來越多的公司和個(gè)人使用G1作為生產(chǎn)環(huán)境中的垃圾回收器。

G1的目標(biāo)是在滿足短時(shí)間停頓的同時(shí)達(dá)到一個(gè)高的吞吐量,適用于多核處理器、大內(nèi)存容量的系統(tǒng)。其實(shí)現(xiàn)特點(diǎn)為:

·短停頓時(shí)間且可控:G1對(duì)內(nèi)存進(jìn)行分區(qū),可以應(yīng)用在大內(nèi)存系統(tǒng)中;設(shè)計(jì)了基于部分內(nèi)存回收的新生代收集和混合收集。

·高吞吐量:優(yōu)化GC工作,使其盡可能與Mutator并發(fā)工作。設(shè)計(jì)了新的并發(fā)標(biāo)記線程,用于并發(fā)標(biāo)記內(nèi)存;設(shè)計(jì)了Refine線程并發(fā)處理分區(qū)之間的引用關(guān)系,加快垃圾回收的速度。

新生代收集指針對(duì)全部新生代分區(qū)進(jìn)行垃圾回收;混合收集指不僅僅回收新生代分區(qū),同時(shí)回收一部分老生代分區(qū),這通常發(fā)生在并發(fā)標(biāo)記之后;Full GC指內(nèi)存不足時(shí)需要對(duì)全部?jī)?nèi)存進(jìn)行垃圾回收。

并發(fā)標(biāo)記是G1新引入的部分,指的是在Mutator運(yùn)行的同時(shí)標(biāo)記哪些對(duì)象是垃圾,看到這里大家一定非常好奇G1到底是怎么實(shí)現(xiàn)的,舉一個(gè)簡(jiǎn)單的例子。比如你的媽媽正在打掃房間,掃房房間需要識(shí)別哪些物品有用哪些無用,無用的物品就是垃圾。同時(shí)你正在房間活動(dòng),活動(dòng)的同時(shí)你可能往房間增加了新的物品,也可能把房間的物品重新組合,也可能產(chǎn)生新的無用物品。最簡(jiǎn)單的垃圾回收器如串行回收器的做法就是在打掃房間標(biāo)識(shí)物品的時(shí)候,你要暫停一切活動(dòng),這個(gè)時(shí)候你的媽媽就能完美地識(shí)別哪些物品有用哪些無用。但最大的問題就是需要你暫停一切活動(dòng)直到房間里面的物品識(shí)別完畢,在實(shí)際系統(tǒng)中意味著這段時(shí)間應(yīng)用程序不能提供服務(wù)。G1的并發(fā)標(biāo)記就是在打掃房間識(shí)別物品有用或者無用的同時(shí),你還可以繼續(xù)活動(dòng),怎么正確做標(biāo)記呢?一個(gè)簡(jiǎn)單的辦法就是在打掃房間識(shí)別垃圾物品開始的時(shí)候記錄你增加了哪些物品,動(dòng)過哪些物品。然后在物品標(biāo)記結(jié)束的時(shí)候?qū)@些變更過的物品重新標(biāo)記一次,當(dāng)然在這一次標(biāo)記時(shí)需要你暫停一切活動(dòng),否則永遠(yuǎn)也沒有盡頭,這通常稱為再標(biāo)記(Remark)。這個(gè)就是所謂的增量并發(fā)標(biāo)記,在G1中具體的算法是Snapshot-At-The-Beginning(SATB),關(guān)于這個(gè)算法我們會(huì)在第6章詳細(xì)介紹。Refine線程也是G1新引入的,它的目的是為了在進(jìn)行部分收集的時(shí)候加速識(shí)別活躍對(duì)象,具體介紹參見第4章。

本書依托于jdk8u的源代碼來介紹JVM如何實(shí)現(xiàn)G1,通過源代碼的分析理解算法以及了解G1提供的參數(shù)的具體意義;最后還會(huì)給出一些例子,通過日志,分析該如何調(diào)整參數(shù)以達(dá)到性能優(yōu)化。

這里提到的jdk8u是指OpenJDK的代碼,OpenJDK是SUN公司(現(xiàn)Oracle)推出的JDK開源代碼,因?yàn)闃?biāo)準(zhǔn)的JDK(這里指Oracle版的JDK)會(huì)有一些內(nèi)部功能的代碼,那些代碼在開源的時(shí)候并未公開。在2017年9月Oracle公司宣布Oracle JDK和OpenJDK將能自由切換,Oracle JDK也會(huì)依賴OpenJDK的代碼進(jìn)行構(gòu)建,所以通常都是使用OpenJDK的代碼進(jìn)行分析和研究。讀者可以自行到OpenJDK的官網(wǎng)上下載源代碼,值得一提的是,JDK的代碼會(huì)隨著bug修復(fù)不斷改變,所以為了保持閱讀的一致性,我把本書使用的代碼推送到GitHub上 https://github.com/chenghanpeng/jdk8u60,也使用該版本進(jìn)行編譯調(diào)試。

主站蜘蛛池模板: 女性| 郑州市| 西丰县| 台前县| 固原市| 高邑县| 遂昌县| 太仓市| 贺州市| 镇雄县| 凤冈县| 石景山区| 松原市| 周口市| 景东| 宜兰县| 仁怀市| 宁乡县| 大丰市| 左云县| 色达县| 红安县| 新干县| 文水县| 湘西| 信宜市| 太仓市| 育儿| 凤山县| 乐山市| 抚顺县| 田林县| 昌黎县| 惠东县| 渭南市| 大连市| 霍邱县| 湘乡市| 通渭县| 宜兰市| 平和县|