Java9新特性(2)--Java標(biāo)準(zhǔn)模塊系統(tǒng)(Jigsaw)(一)

參考地址:http://openjdk.java.net/projects/jigsaw/

前言

????很多朋友可能覺得java9都還沒有整明白,java10就出來取代java9了,java11在官網(wǎng)上也已經(jīng)提上日程了,那我們還有需要學(xué)習(xí)java9么?

????有,當(dāng)然有,因?yàn)闊o論怎么變,它的開發(fā)核心思想是不會(huì)變的,就好像我們的標(biāo)準(zhǔn)模塊化系統(tǒng),模塊化系統(tǒng)可謂是java的一個(gè)重大突破,他的存在使java的運(yùn)行速度有了一個(gè)質(zhì)的飛躍.并且即使java版本怎么變,這個(gè)java的模塊系統(tǒng)這一特性是不會(huì)變的,從新出的java10就可以體現(xiàn)了,java10依然沿用了這個(gè)標(biāo)準(zhǔn)模塊化系統(tǒng).所以現(xiàn)在你們想要用java9,java10甚至是以后的java版本這個(gè)標(biāo)準(zhǔn)模塊化系統(tǒng)的學(xué)習(xí)是必須的.那到底標(biāo)準(zhǔn)模塊化系統(tǒng)到底是什么東西,他和之前的java版本區(qū)別在呢!我們將在本文中掀開他的面紗.

1. 標(biāo)準(zhǔn)模塊化系統(tǒng)存在的意義

????雖然jdk版本升級了,但是還是有的人在使用舊的版本,為了兼容舊版本的內(nèi)容,我們不能把舊的東西丟棄,可是新的東西又越來越多,導(dǎo)致jdk越來越臃腫,越來越大,就像一個(gè)胖子一樣,可是在運(yùn)行的時(shí)候所有的內(nèi)容都要加載進(jìn)去內(nèi)存中,導(dǎo)致了加載時(shí)間變長,運(yùn)行速度變慢,為了改變這樣一個(gè)問題,提出了模塊獨(dú)立、化繁為簡的設(shè)計(jì)理念,從此Jigsaw項(xiàng)目由此誕生.

????Jigsaw項(xiàng)目分為Java SE平臺(tái)設(shè)計(jì)和實(shí)現(xiàn)標(biāo)準(zhǔn)模塊系統(tǒng)兩個(gè)內(nèi)容,也就是說模塊化系統(tǒng)只是Jigsaw項(xiàng)目的一部分。其主要目標(biāo)是為了讓我們的java平臺(tái)的實(shí)現(xiàn)更容易擴(kuò)展到小型設(shè)備,提高安全性和可維護(hù)性,提高應(yīng)用程序性能,并為開發(fā)人員提供更好的大型編程工具。

2. 與之前的版本相比,jdk的改變.

安裝目錄的改變:

安裝目錄變化圖

通過安裝目錄我們可以知道java9做出了一個(gè)洗牌性的改變:
????1.jre文件夾沒有了,jre文件夾包含rt.jar類庫等,jre里面包含了我們java的運(yùn)行環(huán)境和jvm,他被jmods文件夾取代了
????2.lib中刪掉了tools.jar,tools.jar中存放的是javac編譯器等工具類庫.
????3.還有一個(gè)新的conf 目錄,可以讓管理員更改 JDK 配置. Conf 中有網(wǎng)絡(luò)和日志屬性。

那些改變是和標(biāo)準(zhǔn)模塊化系統(tǒng)相關(guān)的呢?

java8及之前版本的運(yùn)行目錄

????Java8以及之前版本的jdk在jvm啟動(dòng)的時(shí)候都需要把所有的jar包通過classloader加載進(jìn)內(nèi)存,不管你是否用到都加載進(jìn)內(nèi)存,所以內(nèi)存需要消耗120MB左右,如果不改變這種加載方式,這個(gè)占的內(nèi)存空間會(huì)隨著版本的更新而增加.

java9運(yùn)行目錄

????java9改變了之后,它把必須加載的jre中的jar包轉(zhuǎn)換成jmods一個(gè)個(gè)的jmod文件了,而這些jmod文件是可選的,系統(tǒng)會(huì)默認(rèn)一個(gè)java.base.jmod文件,其余的我們可以根據(jù)自己的需求進(jìn)行一個(gè)配置,系統(tǒng)會(huì)根據(jù)我們的配置進(jìn)行一個(gè)加載,這樣更好的貼合我們的要求,改變了之后我們的內(nèi)存要求就大大的減少了只需要2-120MB內(nèi)存,這樣做到了因地制宜,我們就可以讓java使用在一些內(nèi)存比較小的設(shè)備中了,甚至可以使用在現(xiàn)在非常流行的物聯(lián)網(wǎng)的應(yīng)用,讓java這個(gè)語言的使用更為廣泛.

????沒有了tools.jar這些jar包,classpath的配置都變得沒有意義了,解決了很多關(guān)于classpath配的問題.類的引用都是通過module-info.java文件進(jìn)行的,清晰明了可維護(hù)性更加高.模塊與模塊之間還需要配置關(guān)系,所以現(xiàn)在類與類之間的訪問不再是單單根據(jù)訪問權(quán)限來了,即使你的類使用了public,如果模塊和模塊之間沒有進(jìn)行依賴也是訪問不了的,提高了訪問的安全性實(shí)現(xiàn)了強(qiáng)封裝.

3. 類加載機(jī)制的變化

Jar包變?yōu)閖mod模塊,可想而知類的加載機(jī)制也會(huì)發(fā)生改變

類關(guān)系圖

????通過類加載機(jī)制的類關(guān)系圖可以發(fā)現(xiàn),java8和java9最大的不同在于ExtClassLoader變成了PlatformClassLoader加載器.

我們現(xiàn)在先來一起了解一下這些加載類的作用吧!

Java8的類加載類:

????Bootstrp loader:啟動(dòng)類加載器,負(fù)責(zé)加載%JAVA_HOME%/jre/lib目錄下的類庫,如rt.jar,為什么上面類關(guān)系圖中沒有顯示這個(gè)類呢,因?yàn)锽ootClassLoader這個(gè)類是C++語言寫的,所以我們不能直接引用.
????ExtClassLoader:擴(kuò)展類加載器,負(fù)責(zé)加載%JAVA_HOME%/jre/lib/ext目錄的類庫
????AppClassLoader:應(yīng)用程序類加載器,負(fù)責(zé)加載系統(tǒng)類路徑classpath目錄下的類庫

三者的加載機(jī)制模型關(guān)系圖如下:

java8雙親委托機(jī)制

????這種模型叫做雙親委托模型,其實(shí)就是當(dāng)我們寫的自定義類需要加載,那么這個(gè)是我們自己寫的程序,是需要AppClassLoader來加載的,但是在AppClassLoader加載之前他先會(huì)委托給ExtClassLoader看看%JAVA_HOME%/jre/lib/ext目錄中有沒有這個(gè)類,那么此時(shí)ExtClassLoader還會(huì)先委托給Bootstrp loader先查%JAVA_HOME%/jre/lib目錄下有沒有這個(gè)類.這樣一級一級地確認(rèn)自定義類是唯一的,這樣的加載方式就是雙親委托加載機(jī)制.
????目的是為了能夠防止重復(fù)加載.

Java9的類加載類:

????BootClassLoader:啟動(dòng)類加載器,加載啟動(dòng)的基礎(chǔ)模塊類,例如: java.base、java.logging 、java.desktop等模塊.
????PlatformClassLoader:加載平臺(tái)相關(guān)的模塊,例如:java.activation 、java.se 、jdk.desktop等模塊
????AppClassLoader:加載應(yīng)用級別的模塊,例如: jdk.javadoc 、 jdk.jshell 、 jdk.jlink 等模塊

三者的加載機(jī)制模型關(guān)系圖如下:

java9雙親委托機(jī)制

????Java9還是雙親委托模型,這是沒毛病的,這樣做的目的還是和之前的版本兼容,但是它在之前的基礎(chǔ)上多加了一層,就是加載自定類,還是通過AppClassLoader加載,

????AppClassLoader先查找BootClassLoader和PlatformClassLoader中我們配置的模塊中有沒有,找了模塊之后如果還是找不到的話就證明這些類可能不在模塊中,所以還是按照舊的加載方式先找PlatformClassLoader對應(yīng)目錄中的類,沒有找到再去找BootClassLoader中對應(yīng)的類.
????PlatformClassLoader也是一樣的,所有加載器配置模塊中找到對應(yīng)的類,找不到再去找BootClassLoader對應(yīng)的目錄中的類.
????BootClassLoader就只需要從自己的模塊中找,模塊找不到再找自己目錄中的類.
????也就是先加載模塊中的類再找目錄下的類

小結(jié):

本文講述了標(biāo)準(zhǔn)模塊化系統(tǒng)對java的好處和加載機(jī)制和之前版本的一個(gè)區(qū)別,但是具體的怎么用我們還沒有去實(shí)現(xiàn),請期待下一篇文章,下一篇文章我們將帶大家使用模塊化系統(tǒng)來開發(fā),真正通過代碼來感受其強(qiáng)大之處.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • JAVA類裝載方式,有兩種: 1.隱式裝載, 程序在運(yùn)行過程中當(dāng)碰到通過new 等方式生成對象時(shí),隱式調(diào)用類裝載器...
    代碼之尖閱讀 692評論 0 48
  • 首先聲明,我是因?yàn)榭戳薎mportNew網(wǎng)站上的幾篇關(guān)于類加載器的文章之后,才萌生了寫這篇文章的想法。所以在寫這篇...
    陳安妮annie1閱讀 308評論 0 1
  • JAVA類裝載方式,有兩種 隱式裝載:程序在運(yùn)行過程中當(dāng)碰到通過new 等方式生成對象時(shí),隱式調(diào)用類裝載器加載對應(yīng)...
    yincb閱讀 634評論 0 2
  • 什么是面向?qū)ο蟪绦蛟O(shè)計(jì) 程序設(shè)計(jì)的本質(zhì)是把人們在現(xiàn)實(shí)生活中遇到的問題通過抽象處理,利用編程語言轉(zhuǎn)換到計(jì)算機(jī)能夠理解...
    遼A丶孫悟空閱讀 775評論 2 23
  • JVM類加載器ClassLoader JAVA類裝載方式 1.隱式裝載, 程序在運(yùn)行過程中當(dāng)碰到通過new 等方式...
    步二小哥閱讀 468評論 0 1

友情鏈接更多精彩內(nèi)容