Java虛擬機(JVM)

Java虛擬機(JVM)一種用於計算機設備的規範,可用不一樣的方式(軟件或硬件)加以實現。編譯虛擬機的指令集與編譯微處理器的指令集很是相似。html

Java虛擬機包括一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。java

Java虛擬機(JVM)是可運行Java代碼的假想計算機。只要根據JVM規格描述將解釋器移植到特定的計算機上,就能保證通過編譯的任何Java代碼可以在該系統上運行。程序員

Java生命週期

  • 啓動。啓動一個Java程序時,一個JVM實例就產生了,任何一個擁有public static void main(String[] args)函數的class均可以做爲JVM實例運行的起點。
  • 運行。main()做爲該程序初始線程的起點,任何其餘線程均由該線程啓動。
  • 消亡。當程序中的全部非守護線程都終止時,JVM才退出;若安全管理器容許,程序也可使用Runtime類或者System.exit()來退出。

一個運行中的Java虛擬機有着一個清晰的任務:執行Java程序。程序開始執行時他才運行,程序結束時他就中止。你在同一臺機器上運行三個程序,就會有三個運行中的Java虛擬機。 Java虛擬機老是開始於一個main()方法,這個方法必須是公有、返回void、直接受一個字符串數組。在程序執行時,你必須給Java虛擬機指明這個包換main()方法的類名。main()方法是程序的起點,他被執行的線程初始化爲程序的初始線程。程序中其餘的線程都由他來啓動。面試

Java中的線程分爲兩種:守護線程 (daemon)和普通線程(non-daemon)。守護線程是Java虛擬機本身使用的線程,好比負責垃圾收集的線程就是一個守護線程。固然,也能夠把本身的程序設置爲守護線程。包含main()方法的初始線程不是守護線程。算法

JVM體系結構

  1) 類裝載器(ClassLoader)(用來裝載.class文件)數組

  2) 執行引擎(執行字節碼,或者執行本地方法)安全

  3) 運行時數據區(方法區、堆、java棧、PC寄存器、本地方法棧)jvm

Java虛擬機由五個部分組成:一組指令集、一組寄存器、一個棧、一個無用單元收集堆(Garbage-collected-heap)、一個方法區域。這五部分是Java虛擬機的邏輯成份,不依賴任何實現技術或組織方式,但它們的功能必須在真實機器上以某種方式實現。函數

1)Java虛擬機支持大約248個字節碼。每一個字節碼執行一種基本的CPU運算,例如,把一個整數加到寄存器,子程序轉移等。Java指令集至關於Java程序的彙編語言優化

Java指令集中的指令包含一個單字節的操做符,用於指定要執行的操做,還有0個或多個操做數,提供操做所需的參數或數據。許多指令沒有操做數,僅由一個單字節的操做符構成。

2)Java虛擬機的寄存器用於保存機器的運行狀態,與微處理器中的某些專用寄存器相似。Java虛擬機的寄存器有四種:

  • pc:Java程序計數器。
  • optop:指向操做數棧頂端的指針。
  • frame:指向當前執行方法的執行環境的指針。
  • vars:指向當前執行方法的局部變量區第一個變量的指針。

3)Java虛擬機的棧有三個區域:局部變量區、運行環境區、操做數區。

4)Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java語言具備無用單元收集能力:它不給程序員顯式釋放對象的能力。Java不規定具體使用的無用單元收集算法,能夠根據系統的需求使用各類各樣的算法。

5)方法區與傳統語言中的編譯後代碼或是Unix進程中的正文段相似。它保存方法代碼(編譯後的java代碼)和符號表。在當前的Java實現中,方法代碼不包括在無用單元收集堆中,但計劃在未來的版本中實現。每一個類文件包含了一個Java類或一個Java界面的編譯後的代碼。能夠說類文件是Java語言的執行代碼文件。爲了保證類文件的平臺無關性,Java虛擬機規範中對類文件的格式也做了詳細的說明。

上圖就是jvm運行時的狀態。Java程序在運行時,須要在內存中的分配空間。爲了提升運算效率,就對數據進行了不一樣空間的劃分,由於每一片區域都有特定的處理數據方式和內存管理方式。

 

【大廠面試經:說一下大家線上JVM是如何優化的?】

http://www.javashuo.com/article/p-gvqtoowt-bx.html

參考

https://www.cnblogs.com/IUbanana/p/7067362.html

https://www.cnblogs.com/smyhvae/p/4810168.html

相關文章
相關標籤/搜索