熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

JVM的內部體系結構淺析

2013-11-23 18:50:37  來源: Java核心技術 
    jvm全稱是Java Virtual Machine(java虛擬機)它之所以被稱之為是虛擬就是因為它僅僅是由一個規范來定義的抽象計算機我們平時經常使用的Sun HotSpot虛擬機只是其中一個具體的實現(另外還有BEA JRockitIBM J等等虛擬機)在實際的計算機上通過軟件來實現一個虛擬計算機與VMWare等類似軟件不同你是看不到jvm的它存在於內存
   
    當啟動一個Java程序時一個虛擬機實例也就誕生了當該程序關閉退出這個虛擬機實例也就隨之消亡如果在同一台計算機上同時運行三個Java程序將得到三個Java虛擬機實例每個Java程序都運行於它自己的Java虛擬機實例中
   
    Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域根據《Java虛擬機規范(第版)》的規定Java虛擬機所管理的內存將會包括以下幾個運行時數據區域如下圖所示
   

  

 
                                                               圖 Java虛擬機的內部體系結構
   
    下面先對圖中各部分做個簡單的說明
   
    class文件虛擬機並不關心Class的來源是什麼語言只要它符合Java class文件格式就可以在Java虛擬機中運行使用Java編譯器可以把Java代碼編譯為存儲字節碼的Class文件使用JRuby等其他語言的編譯器一樣可以把程序代碼編譯成Class文件
   
    類裝載器子系統負責查找並裝載Class 文件到內存最終形成可以被虛擬機直接使用的Java類型
   
    方法區在類裝載器加載class文件到內存的過程中虛擬機會提取其中的類型信息並將這些信息存儲到方法區方法區用於存儲已被虛擬機加載的類信息常量靜態變量即時編譯器編譯後的代碼等數據由於所有線程都共享方法區因此它們對方法區數據的訪問必須被設計為是線程安全的
   
    存儲Java程序創建的類實例所有線程共享因此設計程序時也要考慮到多線程訪問對象(堆數據)的同步問題
   
    Java棧Java棧是線程私有的每當啟動一個新線程時Java虛擬機都會為它分配一個Java棧Java棧以幀為單位保存線程的運行狀態虛擬機只會直接對Java棧執行兩種操作以幀為單位的壓棧或出棧當線程調用java方法時虛擬機壓入一個新的棧幀到該線程的java棧中當方法返回時這個棧幀被從java棧中彈出並拋棄一個棧幀包含一個java方法的調用狀態它存儲有局部變量表操作棧動態鏈接方法出口等信息
   
    程序計數器一個運行中的Java程序每當啟動一個新線程時都會為這個新線程創建一個自己的PC(程序計數器)寄存器程序計數器的作用可以看做是當前線程所執行的字節碼的行號指示器字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令分支循環跳轉異常處理線程恢復等基礎功能都需要依賴這個計數器來完成如果線程正在執行的是一個Java方法這個計數器記錄的是正在執行的虛擬機字節碼指令的地址如果正在執行的是Natvie方法這個計數器值則為空(Undefined)
   
    本地方法棧本地方法棧與虛擬機棧所發揮的作用是非常相似的其區別不過是虛擬機棧為虛擬機執行Java方法(也就是字節碼)服務而本地方法棧則是為虛擬機使用到的Native方法服務任何本地方法接口都會使用某種本地方法棧當線程調用Java方法時虛擬機會創建一個新的棧幀並壓入Java棧然而當它調用的是本地方法時虛擬機會保持Java棧不變不再在線程的Java棧中壓入新的幀虛擬機只是簡單地動態鏈接並直接調用指定的本地方法如果某個虛擬機實現的本地方法接口是使用C連接模型的話那麼它的本地方法棧就是C棧
   
    執行引擎負責執行字節碼方法的字節碼是由Java虛擬機的指令序列構成的每一條指令包含一個單字節的操作碼後面跟隨個或多個操作數執行引擎執行字節碼時首先取得一個操作碼如果操作碼有操作數取得它的操作數它執行操作碼和跟隨的操作數規定的動作然後再取得下一個操作碼這個執行字節碼的過程在線程完成前將一直持續
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25838.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.