您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“JVM的原理是什么”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“JVM的原理是什么”這篇文章吧。
Java虛擬機是Java平臺的基石,解決了硬件和操作系統的相互獨立性。不同平臺(Windows,Linux和MacOS)的JVM都是不同的,但是他們都提供了相同的接口。虛擬機可以分為系統虛擬機和程序虛擬機。系統虛擬機就是VMware和VirtualBox這一類的,完全是對物理資源的隔離。而Java虛擬機是程序虛擬機,它包含了一組指令集并在運行時操作各個不同內存區域,這些指令在JVM中稱為Java字節碼指令。
JVM的基本結構如下圖所示:
圖中的Java文件泛指所有構建在Java虛擬機上的編程語言文件,如Groovy, Scala, Kotlin等。JVM不和上述任何語言關聯,而是使用javac把這些語言編譯為“Class文件”的這種二進制格式。Class文件中包含了JVM指令集和符號表已經其他一些信息。
負責從class字節碼文件中并存放在方法區的內存中,并對數據進行校驗,轉換解析和初始化,最終形成可以被虛擬機直接使用的Java類型。
負責執行虛擬機的字節碼,JVM制定了自己的指令集和體系結構,輸入字節碼文件并輸出執行結果。
是一塊較小的內存空間,可以看做是當前線程所執行的字節碼行號指示器,每個線程都有一個獨立的程序計數器。在虛擬機概念模型中,字節碼解釋器工作時就是通過改變計數器的值來選取下一條待執行的指令。當發生CPU時間片切換的時候,由程序計數器來確保當線程重新獲取到CPU時間片后能夠恢復到正確的執行位置。
如果當前方法是Java方法,程序計數器的值是正在執行的虛擬機字節碼指令地址;如果是Native方法,則為空
是線程私有的,并與線程的生命周期相同。虛擬機棧中又會包含多個棧幀,每運行一個方法就創建一個棧幀,用于存儲局部變量表、操作棧、方法返回值等。每一個方法從調用直至執行完成的過程,就對應一個棧幀在java棧中入棧到出棧的過程。
其中的局部變量表存放了各種基本數據類型,對象引用地址和returnAddress。所以局部變量表所需要的內存空間在編譯期就可以完成分配。當進入到一個方法的時候,該方法所需要在棧幀中的大小是確定的,并且在運行期間不會改變
本地方法棧的作用類似于虛擬機棧,只不過虛擬機棧是為執行Java方法服務,而本地方法棧則為虛擬機使用到的native方法服務
堆在虛擬機啟動的時候創建,是被所有線程共享的一塊內存區域。幾乎所有的對象都放在堆上,堆也就成為了垃圾回收的主要區域。在JDK1.8之前,堆可以分為新生代和老年代,其中新生代又可以細分為Eden,From和To三塊區域。
從JDK1.8開始,永久代從堆內存中被轉移到本地內存中
各個線程共享的內存區域,用于存儲已經被加載的類信息、常量、靜態變量、及時編譯器編譯后的代碼等。在HotSpot虛擬機上方法區就對應上圖中的永久代。該區域不需要連續的內存區域,GC回收的主要目標是針對常量池和類型的卸載。
以上是“JVM的原理是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。