最近學習java虛拟機做了一些整理,會陸續發完。
Java虛拟機
一、概念:當我們談到java虛拟機的時候,有可能指下面3個方面:
1):抽象java虛拟機的規範。
2):一個java虛拟機具體的實作。------實作是指:實作需要有接口,用類實作接口,并實作接口所有方法。就是說先有一個接口,然後寫一個類實作接口中的所定義的方法。
3):一個運作中的java虛拟機執行個體。
而我們經常說的大多數是第三種。也就是一個正在運作的java虛拟機執行個體。
java虛拟機之是以被稱為“虛拟”的,就是因為它僅僅是有一個規範定義的抽象計算機。是以,運作某個java程式,首先需要一個符合該規範的具體實作。
當運作一個java程式的同時,也就在運作一個java虛拟機執行個體。每個java程式都運作于某個具體的java虛拟機實作的執行個體上。它是java編譯器和os平台之間的虛拟處理器。負責與作業系統之間的互動
二、java虛拟機生命周期:
Java虛拟機的産生和消亡是伴随java程式的運作和停止。也就是說當java程式運作的時候,相應的java虛拟機也就誕生了,反正消亡。其具體的實作是通過調用内部main方法來實作。
三:jvm執行java程式的順序是什麼呢?
大緻如下:
Java(源代碼)——>class(位元組碼)——>類加載器——>位元組碼校驗器——>硬體
具體過程: 1、加載class檔案
2、管理配置設定記憶體
3、執行垃圾回收
四、Java虛拟機的體系結構:
組成部分:一系列的子系統、記憶體區域、資料類型和使用指南。這些構成java虛拟機的内部結構。這些組成結構實作了外部行為(java虛拟機與OS之間的實作)和實作内部行為(java虛拟機的内部之間的實作)。
類加載器子系統(class loader subsystem)作用:每個java虛拟機都由類加載器子系統(class loader subsystem)。負責加載程式中類型(類和接口)。
執行引擎(execution engine):負責執行被加載類中的包含的指令。每個java虛拟機都有一個執行引擎(execution engine)。
記憶體區域:程式的執行需要一定的記憶體空間。如位元組碼、被加載的其他額外資訊、程式中的對象、方法參數、傳回值、本地變量、進行中間變量等等。Java虛拟機将這些的資訊統統儲存在資料區中(data areas)。雖然每個java虛拟機的實作中都包含資料區,但是java虛拟機規範對資料區的規定卻非常的抽象。許多結構上的細節部分都留給了java虛拟機實作者的發揮。不同 的java虛拟機實作上的記憶體結構千差萬别。一部分實作可能占用很多記憶體,而其他一下可能隻占用很少的記憶體。一些實作可能會使用虛拟記憶體。
Data areas :資料區中的一部分是整個程式的共有的,有其他部分被單獨的線程控制。每個虛拟機都包含方法去(method area)和堆(heap),他們被整個程式的共享的。
方法區(method area):當java虛拟機加載并解析一個類後,将從類檔案中解析出來資訊儲存在方法區中(method area)。
堆(heap):程式執行時的建立的對象儲存在堆中。
其他的記憶體區域:
PC寄存器概念:又叫指令計數器。中央處理機中的一種寄存器,用來儲存計算機的執行程式的指令位址。
作用:儲存線程執行的下一條指令。這其中包括是否調用本地方法情況:
當不調用本地方法的時候:PC寄存器儲存線程執行下一條指令。
當線程調用本地方法的時候,pc寄存器不儲存線程的下一條執行指令。
Javastacks(java 堆棧)作用:儲存一個線程的調用方法的狀态,包括本地變量、調用方法的參數、傳回值、處理的中間變量。調用本地方法的時的狀态儲存在本地方法堆棧中(native method stacks),也可能在寄存器中。
Javastacks 是由java堆棧塊組成。而堆棧塊包含java方法調用的狀态。
Java虛拟機不使用寄存器儲存中間結果,而是用java堆棧中存放中間結果。
好處:使java虛拟機的指令更緊湊,也更容易在一個沒寄存器的裝置上實作java虛拟機。
資料類型(data types):每個java虛拟機中使用的資料都有确定的資料類型。
資料類型和操作都在java虛拟機規範中嚴格定義的。其中資料類型包括原始資料類型和引用資料類型。
引用類型依賴于實際對象,但不是對象本身。
原始資料類型不依賴任何東西,他們就是本身表示的資料。