jvm的基本結構(轉)
Jvm基本結構
程式計數器:
程式計數器是執行緒私有的,線上程建立的時候就會建立一個程式計數器,程式技術器裡面儲存著指向下一條指令的地址,指令可以實現分支、跳轉、迴圈等基礎功能.
在執行本地方法的時候,程式計數器裡面的值是undefined.
虛擬機器棧:
虛擬機器棧也是執行緒私有的,它是由一系列幀組成的一般都稱為’棧幀’,幀裡面儲存了一個方法的區域性變數、運算元棧、常量池指標
—– 區域性變數:基本資料型別(元資料)和reference、returnAddress,其中long和double佔2個單位的空間,reference指向堆中的物件,returnAddress
—– 運算元棧:java沒有暫存器,所有的引數傳遞都是通過運算元棧來實現
begin iload_0 // 將區域性變數0 (100) 壓棧 iload_1 // 將區域性變數1 (98) 壓棧 iadd // 彈出2個變數,相加,然後將結果壓棧 istore_2 // 彈出結果,儲存到區域性變數2 end |
—– 常量池指標:常量池是指在編譯期被確定,並被儲存在已編譯的.class檔案中的一些資料。除了包含程式碼中所定義的各種基本型別(如:int、long等等)和物件型(如String及陣列)的常量值(final)還包含一些以文字形式出現的符號引用
#類和介面的全限定名
#欄位的名稱的描述符
#方法和名稱的描述符
每當虛擬機器要執行某個需要用到常量池資料的指令時,它都會通過幀資料區中指向常量池的指標來訪問它。常量池中對型別、欄位和方法的引用在開始時都是符號。當虛擬機器在常量池中搜索時,如果遇到類、介面、欄位或者方法的入口,假若它們仍然是符號,虛擬機器那時候才會進行解析。
本地方法棧:
為JVM使用到的Native 方法服務,虛擬機器規範中對本地方法棧中的方法使用的語言、使用方式與資料結構並沒有強制規定,因此具體的虛擬機器可以自由實現它.本地方法(Native Method)就是java呼叫非java程式碼的介面,如
方法區:
型別資訊是由類載入器在類載入時從類檔案中提取出來的
1. 型別的常量池
2. 欄位,方法,靜態變數資訊
3. 方法資訊
方法區是執行緒共享的區域,在Hotspot JVM中 通常指 永久代
JAVA堆:
堆(Heap)是JVM所管理的記憶體中最大的一塊,它是執行緒共享的區域,所有的物件例項都是放在這塊區域,堆被劃分為新生代和老年代,也是GC主要的管理區域.
我們可以通過jdk中bin 目錄下的 jvisualvm.exe 來檢視GC資訊
不管是YGC 還是 FGC 都會是程式停止,因為新生代區域裡面的物件佔用的記憶體比較小GC清理的資料較快,所以程式YGC較快結束程式很快就回復執行,而年老代佔用的記憶體多,所以FGC會執行較長的一段時間,程式會停止較長的時間,應該儘量避免FGC執行的次數來提高程式的效能
棧、堆、方法區的互動