1. 程式人生 > >jvm的基本結構(轉)

jvm的基本結構(轉)

Jvm基本結構

                 

 程式計數器:

程式計數器是執行緒私有的,線上程建立的時候就會建立一個程式計數器,程式技術器裡面儲存著指向下一條指令的地址,指令可以實現分支、跳轉、迴圈等基礎功能.

在執行本地方法的時候,程式計數器裡面的值是undefined.

虛擬機器棧:

虛擬機器棧也是執行緒私有的,它是由一系列幀組成的一般都稱為’棧幀’,幀裡面儲存了一個方法的區域性變數、運算元棧、常量池指標

—–  區域性變數:基本資料型別(元資料)referencereturnAddress,其中longdouble2個單位的空間,reference指向堆中的物件,returnAddress

指向位元組碼指令

—–  運算元棧:java沒有暫存器,所有的引數傳遞都是通過運算元棧來實現

 

begin  

iload_0    // 將區域性變數0 (100) 壓棧  

iload_1    // 將區域性變數1 (98) 壓棧  

iadd      //  彈出2個變數,相加,然後將結果壓棧

istore_2   //  彈出結果,儲存到區域性變數2  

end

  —– 常量池指標:常量池是指在編譯期被確定,並被儲存在已編譯的.class檔案中的一些資料。除了包含程式碼中所定義的各種基本型別(如:intlong等等)和物件型(String及陣列)的常量值(final)還包含一些以文字形式出現的符號引用

:

 #類和介面的全限定名

    #欄位的名稱的描述符

    #方法和名稱的描述符

每當虛擬機器要執行某個需要用到常量池資料的指令時,它都會通過幀資料區中指向常量池的指標來訪問它。常量池中對型別、欄位和方法的引用在開始時都是符號。當虛擬機器在常量池中搜索時,如果遇到類、介面、欄位或者方法的入口,假若它們仍然是符號,虛擬機器那時候才會進行解析。

本地方法棧:

JVM使用到的Native 方法服務,虛擬機器規範中對本地方法棧中的方法使用的語言、使用方式與資料結構並沒有強制規定,因此具體的虛擬機器可以自由實現它.本地方法(Native Method)就是java呼叫非java程式碼的介面,

java通過JNI呼叫C的方法.

方法區:

型別資訊是由類載入器在類載入時從類檔案中提取出來的

1. 型別的常量池

2. 欄位,方法,靜態變數資訊

3. 方法資訊

方法區是執行緒共享的區域,Hotspot JVM中 通常指 永久代

JAVA:

(Heap)JVM所管理的記憶體中最大的一塊,它是執行緒共享的區域,所有的物件例項都是放在這塊區域,堆被劃分為新生代和老年代,也是GC主要的管理區域.

我們可以通過jdkbin 目錄下的 jvisualvm.exe 來檢視GC資訊

 

不管是YGC 還是 FGC 都會是程式停止,因為新生代區域裡面的物件佔用的記憶體比較小GC清理的資料較快,所以程式YGC較快結束程式很快就回復執行,而年老代佔用的記憶體多,所以FGC會執行較長的一段時間,程式會停止較長的時間,應該儘量避免FGC執行的次數來提高程式的效能

棧、堆、方法區的互動