java虚拟机规范 51cto_java虚拟机
最近學(xué)習(xí)java虛擬機(jī)做了一些整理,會陸續(xù)發(fā)完。
Java虛擬機(jī)
一、概念:當(dāng)我們談到j(luò)ava虛擬機(jī)的時候,有可能指下面3個方面:
1):抽象java虛擬機(jī)的規(guī)范。
2):一個java虛擬機(jī)具體的實現(xiàn)。------實現(xiàn)是指:實現(xiàn)需要有接口,用類實現(xiàn)接口,并實現(xiàn)接口所有方法。就是說先有一個接口,然后寫一個類實現(xiàn)接口中的所定義的方法。
3):一個運行中的java虛擬機(jī)實例。
而我們經(jīng)常說的大多數(shù)是第三種。也就是一個正在運行的java虛擬機(jī)實例。
java虛擬機(jī)之所以被稱為“虛擬”的,就是因為它僅僅是有一個規(guī)范定義的抽象計算機(jī)。因此,運行某個java程序,首先需要一個符合該規(guī)范的具體實現(xiàn)。
當(dāng)運行一個java程序的同時,也就在運行一個java虛擬機(jī)實例。每個java程序都運行于某個具體的java虛擬機(jī)實現(xiàn)的實例上。它是java編譯器和os平臺之間的虛擬處理器。負(fù)責(zé)與操作系統(tǒng)之間的交互
二、java虛擬機(jī)生命周期:
Java虛擬機(jī)的產(chǎn)生和消亡是伴隨java程序的運行和停止。也就是說當(dāng)java程序運行的時候,相應(yīng)的java虛擬機(jī)也就誕生了,反正消亡。其具體的實現(xiàn)是通過調(diào)用內(nèi)部main方法來實現(xiàn)。
三:jvm執(zhí)行java程序的順序是什么呢?
大致如下:
Java(源代碼)——>class(字節(jié)碼)——>類加載器——>字節(jié)碼校驗器——>硬件
具體過程: 1、加載class文件
2、管理分配內(nèi)存
3、執(zhí)行垃圾回收
四、Java虛擬機(jī)的體系結(jié)構(gòu):
組成部分:一系列的子系統(tǒng)、內(nèi)存區(qū)域、數(shù)據(jù)類型和使用指南。這些構(gòu)成java虛擬機(jī)的內(nèi)部結(jié)構(gòu)。這些組成結(jié)構(gòu)實現(xiàn)了外部行為(java虛擬機(jī)與OS之間的實現(xiàn))和實現(xiàn)內(nèi)部行為(java虛擬機(jī)的內(nèi)部之間的實現(xiàn))。
類加載器子系統(tǒng)(class loader ?subsystem)作用:每個java虛擬機(jī)都由類加載器子系統(tǒng)(class ?loader subsystem)。負(fù)責(zé)加載程序中類型(類和接口)。
執(zhí)行引擎(execution ?engine):負(fù)責(zé)執(zhí)行被加載類中的包含的指令。每個java虛擬機(jī)都有一個執(zhí)行引擎(execution engine)。
內(nèi)存區(qū)域:程序的執(zhí)行需要一定的內(nèi)存空間。如字節(jié)碼、被加載的其他額外信息、程序中的對象、方法參數(shù)、返回值、本地變量、處理中間變量等等。Java虛擬機(jī)將這些的信息統(tǒng)統(tǒng)保存在數(shù)據(jù)區(qū)中(data areas)。雖然每個java虛擬機(jī)的實現(xiàn)中都包含數(shù)據(jù)區(qū),但是java虛擬機(jī)規(guī)范對數(shù)據(jù)區(qū)的規(guī)定卻非常的抽象。許多結(jié)構(gòu)上的細(xì)節(jié)部分都留給了java虛擬機(jī)實現(xiàn)者的發(fā)揮。不同 的java虛擬機(jī)實現(xiàn)上的內(nèi)存結(jié)構(gòu)千差萬別。一部分實現(xiàn)可能占用很多內(nèi)存,而其他一下可能只占用很少的內(nèi)存。一些實現(xiàn)可能會使用虛擬內(nèi)存。
Data ?areas:數(shù)據(jù)區(qū)中的一部分是整個程序的共有的,有其他部分被單獨的線程控制。每個虛擬機(jī)都包含方法去(method area)和堆(heap),他們被整個程序的共享的。
方法區(qū)(method area):當(dāng)java虛擬機(jī)加載并解析一個類后,將從類文件中解析出來信息保存在方法區(qū)中(method area)。
堆(heap):程序執(zhí)行時的創(chuàng)建的對象保存在堆中。
其他的內(nèi)存區(qū)域:
PC寄存器概念:又叫指令計數(shù)器。中央處理機(jī)中的一種寄存器,用來保存計算機(jī)的執(zhí)行程序的指令地址。
作用:保存線程執(zhí)行的下一條指令。這其中包括是否調(diào)用本地方法情況:
當(dāng)不調(diào)用本地方法的時候:PC寄存器保存線程執(zhí)行下一條指令。
當(dāng)線程調(diào)用本地方法的時候,pc寄存器不保存線程的下一條執(zhí)行指令。
Javastacks(java 堆棧)作用:保存一個線程的調(diào)用方法的狀態(tài),包括本地變量、調(diào)用方法的參數(shù)、返回值、處理的中間變量。調(diào)用本地方法的時的狀態(tài)保存在本地方法堆棧中(native method stacks),也可能在寄存器中。
Javastacks是由java堆棧塊組成。而堆棧塊包含java方法調(diào)用的狀態(tài)。
Java虛擬機(jī)不使用寄存器保存中間結(jié)果,而是用java堆棧中存放中間結(jié)果。
好處:使java虛擬機(jī)的指令更緊湊,也更容易在一個沒寄存器的設(shè)備上實現(xiàn)java虛擬機(jī)。
數(shù)據(jù)類型(data types):每個java虛擬機(jī)中使用的數(shù)據(jù)都有確定的數(shù)據(jù)類型。
數(shù)據(jù)類型和操作都在java虛擬機(jī)規(guī)范中嚴(yán)格定義的。其中數(shù)據(jù)類型包括原始數(shù)據(jù)類型和引用數(shù)據(jù)類型。
引用類型依賴于實際對象,但不是對象本身。
原始數(shù)據(jù)類型不依賴任何東西,他們就是本身表示的數(shù)據(jù)。
總結(jié)
以上是生活随笔為你收集整理的java虚拟机规范 51cto_java虚拟机的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统进程间通信 --- IPC
- 下一篇: 计算机网络 --- 数据交换方式