深入JVM學習筆記 JVM是什麼

JVM是什麼

1、守護和非守護線程
在Java虛擬機內部有兩種線程:守護線程和非守護線程。守護線程通常是由虛擬機自己使用的,例如執行垃圾回收的線程。但是Java程序也可以把它創建的線程標誌爲守護線程。只要還有任何非守護線程運行,虛擬機實例也將存活。

2、方法區
JVM裝載class文件後,就會爲每個類型信息創建一個Class來提取其中的類型信息,這些類的類型信息就會存儲在方法區中。
方法區中會存儲以下類型信息:
基本類型信息---
-這個類型的全限定名
-這個類型的直接超類的全限定名(除非這個類型是java.lang.Object,它沒有超類)
-這個類型是類類型還是接口類型
-這個類型的訪問修飾符(public、abstract或final的某個子集)
-任何直接超接口的全限定名的有序列表

-該類型的常量池
-字段信息
-方法信息
-除了常量以外的類(靜態)變量
-一個到類ClassLoader的引用
-一個到Class類的引用 (對於每個被裝載的類型,虛擬機都會爲它創建一個java.lang.Class的實例)


備註:Class的getClassLoader()方法返回裝載該類型的ClassLoader的引用,如果類型是由啓動裝載器裝載的,則返回null。所有這些信息(Class提供的訪問方法)都是直接從方法區獲得的。

3、棧幀的結構
棧幀由三部分組成:局部變量區,操作數棧和幀數據區。局部變量區和操作數棧的大小要視對應的方法而定,它們是按字長計算的。編譯器在編譯時就確定了這些值並存入class中,而幀數據區則要根據具體的實現而定。
-在一個類實例的方法的局部變量區中,第一個變量是reference引用類型,即指隱藏的this。而類方法則沒有,因爲它不關乎於實例。
-另外需要指出,類變量(靜態的,相對於實例變量)是直接存儲在方法區中的,作爲類類型的一部分。
-在局部變量區和操作數棧中,byte、short、char和boolean都會被轉換爲int,只有當它被存回堆或者方法區中時,纔會轉換回原來的類型。
-在Java棧幀中還需要一些數據來支持常量池解析、正常方法返回以及異常派發機制,這些信息就記錄在幀數據區中。


4、JVM是基於棧的
不同於程序計數器,Java虛擬機沒有寄存器,程序計數器也無法被程序指令直接訪問。Java虛擬機的指令是從操作數棧中而不是從寄存器中取得操作數的,因此它的運行方式是基於棧的而不是基於寄存器的。雖然指令也可以從其他地方去的操作數,比如字節碼流中跟隨在操作碼之後的字節中或者常量池中,但是主要還是從操作數棧中獲得操作數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章