2、JVM之體系結構

JVM體系結構圖java

png

Native Interface(本地接口)數據結構

Java本地接口(Java Native Interface (JNI))容許運行在Java虛擬機(Java Virtual Machine (JVM))上的代碼調用本地程序和類庫,或者被它們調用,這些程序和類庫能夠是其它語言編寫的,好比C、C++或者彙編語言。函數

Program Counter Register(程序計數器)線程

每一個線程都有一個程序計數器,是線程私有的,就是一個指針,指向方法區中的方法字節碼(用來存儲指向下一條指令的地址),由執行引擎讀取下一條指令,是一個很是小的內存空間,幾乎能夠忽略不計。指針

這塊n內存區域很小,它是當前線程所執行的字節碼的行號指示器,字節碼解釋器經過改變這個計數器的值來選取下一條須要執行的字節碼指令。若是是一個native方法,那麼這個計數器就是空的。由於native方法是java經過JNI直接調用本地C/C++庫,能夠近似的認爲native方法至關於C/C++暴露給java的一個接口,java經過調用這個接口從而調用到C/C++方法。因爲該方法是經過C/C++而不是java進行實現。那麼天然沒法產生相應的字節碼,而且C/C++執行時的內存分配是由本身語言決定的,而不是由JVM決定的。對象

Native Method Stack(本地方法棧)blog

本地方法棧的功能和特色相似於虛擬機棧,均具備線程隔離的特色以及都能拋出StackOverflowError和OutOfMemoryError異常。接口

不一樣的是,本地方法棧服務的對象是JVM執行的native方法,而虛擬機棧服務的是JVM執行的java方法。如何去服務native方法?native方法使用什麼語言實現?怎麼組織像棧幀這種爲了服務方法的數據結構?虛擬機規範並未給出強制規定,所以不一樣的虛擬機實能夠進行自由實現,咱們經常使用的HotSpot虛擬機選擇合併了虛擬機棧和本地方法棧。內存

Method Area(方法區)編譯器

方法區是一個被線程共享的內存區域。其中主要存儲加載的類字節碼、class/method/field等元數據對象、static-final常量、static變量、jit編譯器編譯後的代碼等數據。另外,方法區包含了一個特殊的區域「運行時常量池」。

Heap(堆)

堆是 JVM 管理的最大的一塊內存空間,主要用於存放Java類的實例對象.

Java Stack(java棧)

棧也叫棧內存,主管java程序的運行,是在線程建立時建立,它的生命期是跟隨線程的生命期,線程結束棧內存也就釋放,對於棧來講不存在垃圾回收問題,只要線程一結束該棧就Over,聲明週期和線程一致,是線程私有的。8中基本類型的變量+對象的引用變量+實例方法都是在函數的棧內存中分配。

相關文章
相關標籤/搜索