我所理解的Java平臺

對于Java技術(shù)體系,相信每個(gè)Java程序員都會驚嘆于整個(gè)技術(shù)棧的龐大,很多時(shí)候會有入門到放棄的心態(tài),因?yàn)榧夹g(shù)在不斷更新,作為Java程序員也時(shí)刻保持進(jìn)步學(xué)習(xí)狀態(tài),這樣才能跟上技術(shù)的發(fā)展。對于我自己來說,同樣也是使用Java技術(shù)棧工作多年,無論是面試還是日常工作中同事技術(shù)交流,會有很多Java相關(guān)知識點(diǎn)總感覺沒有掌握到位,經(jīng)常是似懂非懂。

因此希望能通過寫作文章來對Java的知識點(diǎn)進(jìn)行鞏固,一方面是希望自己能對Java平臺理解更深刻點(diǎn),另一方面也是希望能通過這樣以拋出問題,后續(xù)解答的方式進(jìn)一步加強(qiáng)學(xué)習(xí),以便達(dá)到鞏固和掌握知識點(diǎn)。

那么今天我想談?wù)摰脑掝}是這么一道面試題:「談?wù)勀銓?Java 平臺的理解?“Java 是解釋執(zhí)行”,這句話正確嗎?

思維導(dǎo)圖

針對Java平臺理解,我的回答是如下思維導(dǎo)圖:

JavaCore01.png

從四個(gè)方面來回答自己對于Java平臺的理解:

  • 基本特性
  • Java類庫
  • Java虛擬機(jī)
  • 工具

基本特性

Java平臺有什么基本特性呢?有面向?qū)ο?、反射、泛型,這三點(diǎn)也是我們在實(shí)際工作項(xiàng)目中會用經(jīng)常用到的。

面向?qū)ο螅∣OP)是一種編程思想,相對于面向過程來說,更符合我們?nèi)祟悂黹喿x代碼的習(xí)慣,更容易寫出通俗易懂的代碼,而面向過程對于計(jì)算機(jī)來說,逐行加載執(zhí)行更便利。面向?qū)ο笕筇匦?,封裝、重載、多態(tài),具體什么含義就不展開了,網(wǎng)上一搜一大把。我更想強(qiáng)調(diào)的是,這三大特性引申出軟件設(shè)計(jì)六大原則,如果你設(shè)計(jì)的程序圍繞的這六大原則,從軟件架構(gòu)角度來看基本不會太差,合乎主流軟件設(shè)計(jì)潮流。

至于反射,也是Java平臺的一大利器,可以滿足動態(tài)加載功能和并行開發(fā)模式,比如很多Java框架都是利用反射機(jī)制達(dá)到開發(fā)的便利性,提高程序員開發(fā)效率,讓程序員可以更專注在自身業(yè)務(wù)開發(fā)上。

最后一點(diǎn),泛型機(jī)制,主要是為了提高開發(fā)穩(wěn)定性,也就是說類型安全,極大提高了程序健壯性,并且泛型機(jī)制還借鑒模板機(jī)制,對于同一種行為規(guī)范,可以套用在不同的數(shù)據(jù)類型上。

Java類庫

除了基本特性之外,Java平臺還有一個(gè)很大特色是豐富的類庫。

比如基礎(chǔ)類庫:集合、IO/NIO、網(wǎng)絡(luò)、并發(fā)、安全等。我們?nèi)粘9ぷ鞒S玫娜萜黝悗?,ArrayList、Map,都有著共同父類,看張圖,你就清楚了,這些系統(tǒng)自帶的容器類:

JavaCore02.png

除此之外,還有線程安全類和豐富的第三方類庫。

Java虛擬機(jī)

Java為何能受廣大開發(fā)者喜愛,很重要的一點(diǎn)就是跨平臺,其中跨平臺最大的特色就是 Write once,run anywhere (寫一次,到處運(yùn)行)。那么跨平臺的關(guān)鍵因素就是Java虛擬機(jī)??聪翵ava虛擬機(jī)的結(jié)構(gòu)圖:


JavaCore03.png

其中重點(diǎn)了解下JVM中每個(gè)模塊的作用,主要包括以下幾個(gè)運(yùn)行時(shí)區(qū)域:

1,程序計(jì)數(shù)器(PC Register),主要是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器。
2,Java虛擬機(jī)棧(Stack)Java中的每個(gè)方法在執(zhí)行的同時(shí)都會創(chuàng)建一個(gè)棧幀用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。我們常見的StackOverflowError錯(cuò)誤,就是常見棧深度大于虛擬機(jī)所允許的深度。
3,本地方法棧(Native Method Stack),執(zhí)行的是虛擬機(jī)使用到Nativie方法服務(wù)。
4,Java堆,也叫Java Heap,這個(gè)是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊,Java堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動時(shí)就創(chuàng)建了。幾乎所有的對象實(shí)例都在這里分配內(nèi)存。
5,方法區(qū)(Class Area)。這個(gè)是主要是用以虛擬機(jī)加載類信息、常量、靜態(tài)變量、編譯之后的代碼等等。

JVM還有一個(gè)特性是垃圾回收策略,相信不少程序員在面試時(shí)經(jīng)常會被問到JVM的垃圾回收策略是什么,新生代、老年代等。主要的垃圾回收策略有這么幾種算法:標(biāo)記-清除算法、復(fù)制算法、標(biāo)記整理算法、分代收集算法,這幾個(gè)算法的依據(jù)是基于可達(dá)分析和引用計(jì)數(shù)思想,來判斷對象是否可回收,進(jìn)一步達(dá)到垃圾回收目的。

至于Java編譯過程,有這四步:源碼-字節(jié)碼-虛擬機(jī)解釋-機(jī)器碼,hotspot 提供了JIT編譯器,Java類加載機(jī)制,常用版本 JDK(如 JDK 8)內(nèi)嵌的 Class-Loader,例如 Bootstrap、 Application 和 Extension Class-loader;類加載大致過程:加載、驗(yàn)證、鏈接、初始化

工具

我們?nèi)粘佑|到 JRE(Java Runtime Environment)或者 JDK(Java Development Kit)。 JRE,也就是 Java 運(yùn)行環(huán)境,包含了 JVM 和 Java 類庫,以及一些模塊等。而 JDK 可以看作是 JRE 的一個(gè)超集,提供了更多工具,比如編譯器、各種診斷工具等。

我們需要善于利用這些工具,了解各種工具用法,以便在面對實(shí)際問題時(shí),可以通過不同工具進(jìn)一步排查,很多時(shí)候面對問題時(shí)候,往往不是解決問題有多困難,而是分析定位問題原因有多耗時(shí)。

小結(jié)

總的來說,我是從以上四個(gè)方面來理解所謂的Java平臺,除此之外,還想補(bǔ)充一點(diǎn),那就是「靜態(tài)編譯與動態(tài)解釋」這點(diǎn)。 靜態(tài)編譯的程序在執(zhí)行前全部被翻譯為機(jī)器碼,通常將這種類型稱為AOT (Ahead of time)即 “提前編譯”; 而解釋執(zhí)行的則是一句一句邊翻譯邊運(yùn)行,通常將這種類型稱為JIT(Just-in-time)即“即時(shí)編譯”。 AOT程序的典型代表是用C/C++開發(fā)的應(yīng)用,它們必須在執(zhí)行前編譯成機(jī)器碼,而JIT的代表則非常多,如JavaScript、python等。 事實(shí)上,所有腳本語言都支持JIT模式。但需要注意的是JIT和AOT指的是程序運(yùn)行方式,和編程語言并非強(qiáng)關(guān)聯(lián)的,有些語言既可以以JIT方式運(yùn)行也可以以AOT方式運(yùn)行,如Java、Python,它們可以在第一次執(zhí)行時(shí)編譯成中間字節(jié)碼、然后在之后執(zhí)行時(shí)可以直接執(zhí)行字節(jié)碼。

至于Java語言是否是解釋執(zhí)行,因?yàn)镴ava平臺有AOT也有JIT,因此Java語言是可以進(jìn)行解釋執(zhí)行的,可以直接將字節(jié)碼編譯成機(jī)器代碼,這樣就避免了 JIT 預(yù)熱等各方面的開銷,比如 Oracle JDK 9 就引入了實(shí)驗(yàn)性的 AOT 特性,并且增加了新的 jaotc 工具。

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

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

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