JVM

HotSpot是JVM的核心組件,JDK每次版本更新在於JDK以及JVM的運行效率(對class文件的解析以及編譯)。

在1.3之前版本,核心不是HotSpot,當運行class時,通過classLoader加載到虛擬機中,JVM需要將class文件編譯成本地代碼(CPU能夠直接處理),每次加載class都需要轉換,轉換頻率越多性能消耗越大。在1.3版本之後(jdk1.5真正引入),引入HotSpot(熱點探測),對class文件做標記,當達到一定閾值時,觸發JIT(即時編譯),對頻繁使用的class文件直接編譯成本地代碼進行緩存,以便於下次直接運行(不必再次編譯)。

JVM有兩個版本,client以及server,其爲一個JVM,只是採用兩套不同機制初始化,client對桌面級應用進行內存分配進行優化(內存分配空間相比server端要小,因爲其交互相比於B/S效率要低),其爲JVM默認啓動的。在JDK的安裝文件中,即jdk內jre中lib下,有i386的目錄內有jvm.cfg,內部有-client 以及 -server,誰在上邊就以什麼形式啓動。

1)類加載子系統與方法區:類加載子系統負責從文件系統或者網絡中加載class,加載的類信息存放於稱爲方法區的內存空間。除類信息外,方法區可能存放運行時常量池信息,包括字符串字面量和數字常量(這部分常量信息是class文件中常量池部分的映射)

2)java堆:在JVM啓動時建立,主要內存工作區域,幾乎所有對象實例存放在java堆中,堆空間由所有線程共享。

3)直接內存:java的NIO庫允許java使用直接內存,直接內存是在java堆外的,直接向系統申請的內存空間,通常訪問直接內存的速度由於java堆。出於性能考慮,讀寫頻繁的場合可能會考慮使用直接內存,由於在java堆外,因此其大小不會直接受限於Xmx指定的最大堆大小,但是系統內存有限,java堆和直接內存的綜合受限於操作系統所能給出的最大內存。

4)垃圾回收系統:可以對java堆,方法區,以及直接內存進行回收。其中java堆是回收重點,和c/c++不同,java中所有的對象空間釋放都是隱式的,對於不再使用的垃圾對象,垃圾回收系統會在後臺查找、標識並釋放垃圾對象。

5)java棧:每個java虛擬機線程都有私有的java棧,一個線程的java棧在線程創建的時候創建,java棧中保存着幀信息,java棧中保存着局部變量、方法參數,同時和java方法的調用、返回密切相關。

6)本地方法棧:本地方法棧與java棧類似,不同在於java棧用於方法的調用,而本地方法棧用於本地方法的調用,作爲對java虛擬機的重要擴展,java虛擬機允許java直接調用本地方法(通常使用c編寫)。

7)PC寄存器:PC寄存器是每一個線程的私有空間,JVM爲每一個線程創建PC寄存器,在任意時刻,線程總是在執行一個方法,這個正在被執行的方法稱爲當前方法。如果當前方法不是本地方法,PC寄存器就會指向當前正在被執行的指令,如果當前方法是本地方法,那麼PC寄存器的值就是undefined。

8)執行引擎:負責執行java的字節碼,現代虛擬機爲了提高執行效率,會使用即使編譯技術將方法編譯成機器碼後再執行。

JVM根據對象存活週期不同,將堆內存劃分爲幾塊,一般分爲新生代,老年代和永久代(對HotSpot而言),此爲JVM內存分代策略。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章