国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

詳細(xì)介紹什么是Java虛擬機

2019-11-18 15:30:30
字體:
供稿:網(wǎng)友

一、什么是java虛擬機
     當(dāng)你談到Java虛擬機時,你可能是指:
     1、抽象的Java虛擬機規(guī)范
     2、一個具體的Java虛擬機實現(xiàn)

     3、一個運行的Java虛擬機實例
二、Java虛擬機的生命周期
     一個運行中的Java虛擬機有著一個清楚的任務(wù):執(zhí)行Java程序。程序開始執(zhí)行時他才運行,程序結(jié)束時他就停止。你在同一臺機器上運行三個程序,就會有三個運行中的Java虛擬機。
     Java虛擬機總是開始于一個main()方法,這個方法必須是公有、返回void、直接受一個字符串?dāng)?shù)組。在程序執(zhí)行時,你必須給Java虛擬機指明這個包換main()方法的類名。
     Main()方法是程序的起點,他被執(zhí)行的線程初始化為程序的初始線程。程序中其他的線程都由他來啟動。Java中的線程分為兩種:守護線程 (daemon)和普通線程(non-daemon)。守護線程是Java虛擬機自己使用的線程,比如負(fù)責(zé)垃圾收集的線程就是一個守護線程。當(dāng)然,你也可 以把自己的程序設(shè)置為守護線程。包含Main()方法的初始線程不是守護線程。
     只要Java虛擬機中還有普通的線程在執(zhí)行,Java虛擬機就不會停止。假如有足夠的權(quán)限,你可以調(diào)用exit()方法終止程序。
三、Java虛擬機的體系結(jié)構(gòu)
     在Java虛擬機的規(guī)范中定義了一系列的子系統(tǒng)、內(nèi)存區(qū)域、數(shù)據(jù)類型和使用指南。這些組件構(gòu)成了Java虛擬機的內(nèi)部結(jié)構(gòu),他們不僅僅為Java虛擬機的實現(xiàn)提供了清楚的內(nèi)部結(jié)構(gòu),更是嚴(yán)格規(guī)定了Java虛擬機實現(xiàn)的外部行為。 
     每一個Java虛擬機都由一個類加載器子系統(tǒng)(class loader subsystem),負(fù)責(zé)加載程序中的類型(類和接口),并賦予唯一的名字。每一個Java虛擬機都有一個執(zhí)行引擎(execution engine)負(fù)責(zé)執(zhí)行被加載類中包含的指令。
     程序的執(zhí)行需要一定的內(nèi)存空間,如字節(jié)碼、被加載類的其他額外信息、程序中的對象、方法的參數(shù)、返回值、本地變量、處理的中間變量等等。Java虛擬機將 這些信息統(tǒng)統(tǒng)保存在數(shù)據(jù)區(qū)(data areas)中。雖然每個Java虛擬機的實現(xiàn)中都包含數(shù)據(jù)區(qū),但是Java虛擬機規(guī)范對數(shù)據(jù)區(qū)的規(guī)定卻非常的抽象。許多結(jié)構(gòu)上的細(xì)節(jié)部分都留給了 Java虛擬機實現(xiàn)者自己發(fā)揮。不同Java虛擬機實現(xiàn)上的內(nèi)存結(jié)構(gòu)千差萬別。一部分實現(xiàn)可能占用很多內(nèi)存,而其他以下可能只占用很少的內(nèi)存;一些實現(xiàn)可 能會使用虛擬內(nèi)存,而其他的則不使用。這種比較精煉的Java虛擬機內(nèi)存規(guī)約,可以使得Java虛擬機可以在廣泛的平臺上被實現(xiàn)。
     數(shù)據(jù)區(qū)中的一部分是整個程序共有,其他部分被單獨的線程控制。每一個Java虛擬機都包含方法區(qū)(method area)和堆(heap),他們都被整個程序共享。Java虛擬機加載并解析一個類以后,將從類文件中解析出來的信息保存與方法區(qū)中。程序執(zhí)行時創(chuàng)建的 對象都保存在堆中。 
     當(dāng)一個線程被創(chuàng)建時,會被分配只屬于他自己的PC寄存器“pc register”(程序計數(shù)器)和Java堆棧(Java stack)。當(dāng)線程不掉用本地方法時,PC寄存器中保存線程執(zhí)行的下一條指令。Java堆棧保存了一個線程調(diào)用方法時的狀態(tài),包括本地變量、調(diào)用方法的 參數(shù)、返回值、處理的中間變量。調(diào)用本地方法時的狀態(tài)保存在本地方法堆棧中(native method stacks),可能再寄存器或者其他非平臺獨立的內(nèi)存中。
     Java堆棧有堆棧塊(stack frames (or frames))組成。堆棧塊包含Java方法調(diào)用的狀態(tài)。當(dāng)一個線程調(diào)用一個方法時,Java虛擬機會將一個新的塊壓到Java堆棧中,當(dāng)這個方法運行結(jié)束時,Java虛擬機會將對應(yīng)的塊彈出并拋棄。
     Java虛擬機不使用寄存器保存計算的中間結(jié)果,而是用Java堆棧在存放中間結(jié)果。這是的Java虛擬機的指令更緊湊,也更輕易在一個沒有寄存器的設(shè)備上實現(xiàn)Java虛擬機。 
     圖中的Java堆棧中向下增長的,PC寄存器中線程三為灰色,是因為它正在執(zhí)行本地方法,他的下一條執(zhí)行指令不保存在PC寄存器中。
四、數(shù)據(jù)類型(Data Types)
     所有Java虛擬機中使用的數(shù)據(jù)都有確定的數(shù)據(jù)類型,數(shù)據(jù)類型和操作都在Java虛擬機規(guī)范中嚴(yán)格定義。Java中的數(shù)據(jù)類型分為原始數(shù)據(jù)類型 (PRimitive types)和引用數(shù)據(jù)類型(reference type)。引用類型依靠于實際的對象,但不是對象本身。原始數(shù)據(jù)類型不依靠于任何東西,他們就是本身表示的數(shù)據(jù)。
所有Java程序語言中的原始 數(shù)據(jù)類型,都是Java虛擬機的原始數(shù)據(jù)類型,除了布爾型(boolean)。當(dāng)編譯器將Java源代碼編譯為自己碼時,使用整型(int)或者字節(jié)型 (byte)去表示布爾型。在Java虛擬機中使用整數(shù)0表示布爾型的false,使用非零整數(shù)表示布爾型的true,布爾數(shù)組被表示為字節(jié)數(shù)組,雖然他 們可能會以字節(jié)數(shù)組或者字節(jié)塊(bit fields)保存在堆中。
     除了布爾型,其他Java語言中的原始類型都是Java虛擬機中的數(shù)據(jù)類型。在Java中數(shù)據(jù)類型被分為:整形的byte,short,int,long;char和浮點型的float,double。Java語言中的數(shù)據(jù)類型在任何主機上都有同樣的范圍。 
     在Java虛擬機中還存在一個Java語言中不能使用的原始數(shù)據(jù)類型返回值類型(returnValue)。這種類型被用來實現(xiàn)Java程序中的“finally clauses”,具體的參見18章的“Finally Clauses”。
     引用類型可能被創(chuàng)建為:類類型(class type),接口類型(interface type),數(shù)組類型(array type)。他們都引用被動態(tài)創(chuàng)建的對象。當(dāng)引用類型引用null時,說明沒有引用任何對象。
     Java虛擬機規(guī)范只定義了每一種數(shù)據(jù)類型表示的范圍,沒有定義在存儲時每種類型占用的空間。他們?nèi)绾未鎯τ蒍ava虛擬機的實現(xiàn)者自己決定。關(guān)于浮點型更多信息參見14章“Floating Point Arithmetic”。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 泽普县| 中超| 浦县| 台安县| 古浪县| 苍南县| 军事| 高邮市| 正安县| 云霄县| 木里| 靖宇县| 安福县| 云林县| 乌兰察布市| 本溪| 和田市| 商丘市| 五莲县| 晋中市| 西城区| 台山市| 读书| 台前县| 西吉县| 全椒县| 阿瓦提县| 华宁县| 凌源市| 自治县| 彭水| 屏边| 淅川县| 博白县| 炉霍县| 武山县| 天门市| 南阳市| 铁岭县| 大方县| 新化县|