【JVM系列】一步步解析java執(zhí)行內(nèi)幕

對(duì)于任何一門語言,要想達(dá)到精通的水平充尉,研究它的執(zhí)行原理(或者叫底層機(jī)制)不失為一種良好的方式飘言。在本篇文章中,將重點(diǎn)研究java源代碼的執(zhí)行原理驼侠,即從程

序員編寫JAVA源代碼姿鸿,到最終形成產(chǎn)品谆吴,在整個(gè)過程中,都經(jīng)歷了什么苛预?每一步又是怎么執(zhí)行的句狼?執(zhí)行原理又是什么?.....

????當(dāng)然热某,本篇文章的粒度可能稍微側(cè)重于宏觀方面腻菇,更細(xì)粒度的技術(shù)分析,需要在接下來的該系列文章中與大家分享....

一 編寫java源程序

??java源文件:指存儲(chǔ)java源碼的文件昔馋;

當(dāng)前比較主流的JAVA IDE?(1)Intellij IDEA(首推薦)(2)Eclipse

先來看看如下代碼:

//MyTest被public修飾筹吐,故存儲(chǔ)該java源碼的文件名為MyTest

public class MyTest {

??public static void main(String[] args){

????System.out.println("Test Java execute process.");

??}

}

//由于MyTest被public修飾了,故Class A不能用public修飾

class A{}

//由于MyTest被public修飾了秘遏,故Class B不能用public修飾

class B{}

(1)java源文件名就是該源文件中public類的名稱

(2)一個(gè)java源文件可以包含多個(gè)類丘薛,但只允許一個(gè)類為public

二 編譯java源代碼

????當(dāng)java源程序編碼結(jié)束后,就需要編譯器編譯邦危,安裝好jdk后洋侨,我們打開jdk目錄,有兩個(gè).exe文件倦蚪,

即javac.exe(編譯源代碼希坚,即.java文件)和java.exe(執(zhí)行字節(jié)碼,即.class文件)

1.切換到MyTest.java文件夾

2.javac.exe編譯MyTest.java

編譯后陵且,發(fā)現(xiàn)e:\Blogs 目錄多了以class為后綴的文件:A.class,B.class和MyTest.class

Tip:當(dāng)javac.exe編譯java源代碼時(shí)吏够,java源代碼有幾個(gè)類,就會(huì)編譯成一個(gè)對(duì)應(yīng)的字節(jié)碼文件(.class文件)滩报,

其中锅知,字節(jié)碼文件的文件名就是每個(gè)類的類名。需要注意的是脓钾,類即使不在源文件中定義售睹,但被源文件引用,

編譯后可训,也會(huì)編程相應(yīng)的字節(jié)碼文件昌妹,如類A引用類C,但類C不定義在類A的源文件中握截,編譯后飞崖,類C也被編

譯成對(duì)應(yīng)的字節(jié)碼文件C.class

三 執(zhí)行java源文件

?執(zhí)行java源文件,用java.exe執(zhí)行即可

到現(xiàn)在谨胞,java源程序基本執(zhí)行結(jié)果固歪,并正確打印我們期望的結(jié)果,那么,如上的步驟牢裳,我們可以總結(jié)如下:

如上總結(jié)逢防,已經(jīng)抽象化了在JVM中的執(zhí)行,接下來蒲讯,我們將分析忘朝,字節(jié)碼文件(.calss文件)如何在虛擬機(jī)中一步一執(zhí)行的。

四 JVM如何執(zhí)行字節(jié)碼文件

(一) 裝載字節(jié)碼文件

????當(dāng).java源碼被javac.exe編譯器編譯成.class字節(jié)碼文件后判帮,接下來的工作就交給JVM處理局嘁,JVM首先通過類加載器(ClassLoader)

將class文件和相關(guān)Java API加載裝入JVM,以供JVM后續(xù)處理晦墙。

????在該階段中导狡,涉及到如下一些基本概念和知識(shí)。

?1.JDK,JRE和JVM關(guān)系

(1)JDK(Java Development Kit)偎痛,Java開發(fā)工具包,主要用于開發(fā)独郎,在JDK7前踩麦,JDK包括JRE

(2)JRE(Java Runtime Environment),Java程序運(yùn)行的核心環(huán)境氓癌,包括JVM和一些核心庫

(3)JVM(Java Virtual Machine)谓谦,VM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來的計(jì)算機(jī)贪婉,是通過在實(shí)際的計(jì)算機(jī)上仿真模擬

?????各種計(jì)算機(jī)功能來實(shí)現(xiàn)的反粥,是JRE核心模塊。

2.JVM

????JVM是一種用于計(jì)算設(shè)備的規(guī)范疲迂,它是一個(gè)虛構(gòu)出來的計(jì)算機(jī)才顿,是通過在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能來實(shí)現(xiàn)的。Java虛擬機(jī)

虛擬機(jī)的主要任務(wù)是裝載class文件并執(zhí)行其中的字節(jié)碼尤蒿,不同的Java虛擬機(jī)中郑气,執(zhí)行引擎可能由不同的實(shí)現(xiàn),大致有如下幾種引擎:

??一次性解釋字節(jié)碼引擎

??即時(shí)編譯引擎

??自適應(yīng)優(yōu)化器

???關(guān)于虛擬機(jī)的實(shí)現(xiàn)方式腰池,采用軟件方式尾组、硬件方式和軟件硬件結(jié)合方式,這個(gè)要根據(jù)具體廠商而定示弓。

3.什么是ClassLoader

????虛擬機(jī)的主要任務(wù)是裝載class文件并執(zhí)行其中的字節(jié)碼讳侨,而class文件是由虛擬機(jī)的類加載器(ClassLoader)完成的,在一個(gè)Java虛擬機(jī)奏属,

有可能存在多個(gè)類加載器跨跨。

????任何java運(yùn)用程序,可能會(huì)使用兩種類加載器囱皿,即啟動(dòng)類加載器(bootstrap)和用戶自定義類加載器歹叮。

????啟動(dòng)類加載器是Java虛擬機(jī)唯一實(shí)現(xiàn)的一部分跑杭,它又可分為原始類裝載器,系統(tǒng)類裝載器或默認(rèn)類裝載器咆耿,它的主要作用是從操作系統(tǒng)的

磁盤裝載相應(yīng)的類德谅,如Java API類等。

????用戶自定義裝載類萨螺,按照用戶自定義的方式來裝載類窄做。

(二)將字節(jié)碼文件存儲(chǔ)在JVM內(nèi)存區(qū)

????當(dāng)JAVA虛擬機(jī)運(yùn)行一個(gè)程序時(shí),它需要內(nèi)存來存儲(chǔ)許多東西慰技,如字節(jié)碼椭盏,從已裝載的class文件中得到的其他信息,程序創(chuàng)建的對(duì)象吻商,傳遞給

方法的參數(shù)掏颊,返回值,局部變量以及運(yùn)算的中間結(jié)果等艾帐,這些相關(guān)信息被組織到“運(yùn)行時(shí)數(shù)據(jù)區(qū)”乌叶。

????根據(jù)廠商的不同,在Java虛擬機(jī)中柒爸,運(yùn)行時(shí)數(shù)據(jù)區(qū)也有所不同准浴,有些運(yùn)行時(shí)數(shù)據(jù)區(qū)由線程共享,有些只能由某個(gè)特定線程共享捎稚。運(yùn)行時(shí)數(shù)據(jù)區(qū)

大致可分幾個(gè)區(qū):方法區(qū)乐横,堆區(qū),棧區(qū)今野,PC寄存器區(qū)和本地方法棧區(qū)葡公。

????在該階段中,涉及到如下基本概念和知識(shí)条霜。

???1.方法區(qū)

????方法區(qū)用來存儲(chǔ)解析被加載的class文件的相關(guān)信息匾南。當(dāng)虛擬裝載一個(gè)class文件后,它會(huì)從這個(gè)class文件包含的二進(jìn)制數(shù)據(jù)中解析類型信息蛔外,然后將

該相關(guān)信息存儲(chǔ)到方法區(qū)中蛆楞。

???2.堆

?????堆是用來存儲(chǔ)相關(guān)引用類型的,如new對(duì)象夹厌。當(dāng)程序運(yùn)行時(shí)豹爹,虛擬機(jī)會(huì)把所有該程序在運(yùn)行時(shí)創(chuàng)建的對(duì)象都放到堆中。

???3.PC寄存器

????PC寄存器主要用來存儲(chǔ)線程矛纹。當(dāng)新創(chuàng)建一個(gè)線程時(shí)臂聋,該線程都將得到一個(gè)自己的PC寄存器(程序計(jì)數(shù)器)以及一個(gè)java棧。

Java虛擬機(jī)沒有寄存器,其指令集使用Java棧來存儲(chǔ)中間數(shù)據(jù)孩等。

???4.棧區(qū)

????棧區(qū)主要用來存儲(chǔ)值類型的艾君,如基本數(shù)據(jù)類型,需要注意的時(shí)肄方,String為引用類型冰垄,是存在堆中的。Java棧是由許多棧

幀組成的权她,一個(gè)棧幀包含一個(gè)Java方法調(diào)用的狀態(tài)虹茶,當(dāng)線程調(diào)用一個(gè)方法時(shí),虛擬機(jī)壓入一個(gè)新的棧幀到該線程的Java棧中

隅要,當(dāng)該方法返回時(shí)蝴罪,這個(gè)棧幀從Java棧中彈出。

(三)執(zhí)行引擎與運(yùn)行時(shí)數(shù)據(jù)區(qū)交互

??運(yùn)行時(shí)數(shù)據(jù)區(qū)為執(zhí)行引擎提供了執(zhí)行環(huán)境和相關(guān)數(shù)據(jù)步清,執(zhí)行引擎通過與運(yùn)行時(shí)數(shù)據(jù)區(qū)交互要门,從而獲取

執(zhí)行時(shí)需要的相關(guān)信息沧烈,存儲(chǔ)執(zhí)行的中間結(jié)果等


(四)執(zhí)行引擎與本地方法接口

當(dāng)要執(zhí)行本地方法時(shí)自赔,執(zhí)行引擎將調(diào)用本地方法接口來獲取相關(guān)OS本地方法跌宛,需要注意的是预愤,本地方法與操作系統(tǒng)強(qiáng)耦合的。

(五)JVM在具體操作系統(tǒng)上執(zhí)行

JVM通過調(diào)用本地接口來獲取本地方法淋叶,從而實(shí)現(xiàn)在具體的平臺(tái)上執(zhí)行,如在Linux系統(tǒng)上執(zhí)行,在Window系統(tǒng)上

執(zhí)行和在Unix系統(tǒng)上執(zhí)行书聚。

歡迎工作一到五年的Java工程師朋友們加入Java程序員開發(fā): 854393687

群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)藻雌、高性能及分布式雌续、Jvm性能調(diào)優(yōu)、Spring源碼胯杭,MyBatis驯杜,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個(gè)知識(shí)點(diǎn)的架構(gòu)資料)合理利用自己每一分每一秒的時(shí)間來學(xué)習(xí)提升自己,不要再用"沒有時(shí)間“來掩飾自己思想上的懶惰做个!趁年輕鸽心,使勁拼,給未來的自己一個(gè)交代居暖!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顽频,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子太闺,更是在濱河造成了極大的恐慌糯景,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蟀淮,居然都是意外死亡最住,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門怠惶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涨缚,“玉大人,你說我怎么就攤上這事甚疟≌提” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵览妖,是天一觀的道長轧拄。 經(jīng)常有香客問我,道長讽膏,這世上最難降的妖魔是什么檩电? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮府树,結(jié)果婚禮上俐末,老公的妹妹穿的比我還像新娘。我一直安慰自己奄侠,他們只是感情好卓箫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垄潮,像睡著了一般烹卒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上弯洗,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天旅急,我揣著相機(jī)與錄音,去河邊找鬼牡整。 笑死藐吮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逃贝。 我是一名探鬼主播谣辞,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼沐扳!你這毒婦竟也來了潦闲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤迫皱,失蹤者是張志新(化名)和其女友劉穎歉闰,沒想到半個(gè)月后辖众,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡和敬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年凹炸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昼弟。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡啤它,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舱痘,到底是詐尸還是另有隱情变骡,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布芭逝,位于F島的核電站塌碌,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏旬盯。R本人自食惡果不足惜台妆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胖翰。 院中可真熱鬧接剩,春花似錦、人聲如沸萨咳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽培他。三九已至鹃两,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間靶壮,已是汗流浹背怔毛。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來泰國打工员萍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腾降,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓碎绎,卻偏偏與公主長得像螃壤,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子筋帖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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

  • 原文:Understanding JVM Internals by Se Hoon Park On 05/30/2...
    碼代碼的陳同學(xué)閱讀 941評(píng)論 0 13
  • (一)Java部分 1奸晴、列舉出JAVA中6個(gè)比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,107評(píng)論 0 62
  • 每個(gè)使用Java的開發(fā)者都知道Java字節(jié)碼是在JRE中運(yùn)行(JRE: Java 運(yùn)行時(shí)環(huán)境)。JVM則是JRE中...
    燕京博士閱讀 1,408評(píng)論 0 6
  • 檀日麸。 秀木寄啼,奇山逮光。 輕似霧,淡如煙墩划。 紋細(xì)色暗涕刚,味香質(zhì)堅(jiān)。 精雕琢作器乙帮,粗制刻成龕杜漠。 幽靜夜迎明月,芬芳風(fēng)送晴天察净。...
    王永豪閱讀 193評(píng)論 0 1
  • 得到品控手冊(cè)(3.1.2版氢卡,2017年8月31日發(fā)布)中關(guān)于訂閱產(chǎn)品的上線檢查清單中有一條: 8.6 學(xué)習(xí)小組名稱...
    問天eric閱讀 1,834評(píng)論 0 2