亚洲综合极品香蕉久久网,久久夜精品综合缴情五月 ,亚洲动漫成人一区二区,国产在线不卡视频,国产丝袜精品不卡,亚洲乱码日产精品bd,久久久久久国产精品免费网站,亚洲综合av一区二区三区
×
新網 > 虛擬主機 > 正文

淺析Java虛擬機結構與機制 (上)

  • 作者:新網
  • 來源:新網
  • 瀏覽:100
  • 2018-05-11 15:15:39

本文主要介紹JVM的組成部分以及它們內部工作的機制和原理。在研究JVM的過程中會發現,其實JVM本身就是一個計算機體系結構,很多原理和我們平時的硬件、微機原理、 操作系統都有十分相似的地方,所以學習JVM本身也是加深自我對計算機結構認識的一個很好的途徑。

   本文主要介紹JVM的組成部分以及它們內部工作的機制和原理。在研究JVM的過程中會發現,其實JVM本身就是一個計算機體系結構,很多原理和我們平時的硬件、微機原理、 操作系統都有十分相似的地方,所以學習JVM本身也是加深自我對計算機結構認識的一個很好的途徑。

<div>  一、JVM結構
3684507445142637698.jpg
  JVM主要由類加載器子系統、運行時數據區(內存空間)、執行引擎以及與本地方法接口等組成。其中運行時數據區又由方法區、堆、Java棧、PC寄存器、本地方法棧組成。JVM主要由類加載器子系統、運行時數據區(內存空間)、執行引擎以及與本地方法接口等組成。其中運行時數據區又由方法區、堆、Java棧、PC寄存器、本地方法棧組成。
  眾所周知,Java語言具有跨平臺的特性,這也是由JVM來實現的。更準確地說,是Sun利用JVM在不同平臺上的實現幫我們把平臺相關性的問題給 解決了,這就好比是HTML語言可以在不同廠商的瀏覽器上呈現元素(雖然某些瀏覽器在對W3C標準的支持上還有一些問題)。同時,Java語言支持通過 JNI(Java Native Interface)來實現本地方法的調用,但是需要注意到,如果你在Java程序用調用了本地方法,那么你的程序就很可能不再具有跨平臺性,即本地方法 會破壞平臺無關性。
  二、類加載器子系統(Class Loader)
  類加載器子系統負責加載編譯好的.class字節碼文件,并裝入內存,使JVM可以實例化或以其它方式使用加載后的類。 JVM的類加載子系統支持在運行時的動態加載,動態加載的優點有很多,例如可以節省內存空間、靈活地從網絡上加載類,動態加載的另一好處是可以通過命名空 間的分隔來實現類的隔離,增強了整個系統的安全性。
  1、ClassLoader的分類:
  a.啟動類加載器(BootStrap Class Loader):負責加載rt.jar文件中所有的Java類,即Java的核心類都是由該ClassLoader加載。在Sun JDK中,這個類加載器是由C++實現的,并且在Java語言中無法獲得它的引用。
  b.擴展類加載器(Extension Class Loader):負責加載一些擴展功能的jar包。
  c.系統類加載器(System Class Loader):負責加載啟動參數中指定的Classpath中的jar包及目錄,通常我們自己寫的Java類也是由該ClassLoader加載。在Sun JDK中,系統類加載器的名字叫AppClassLoader。
  d.用戶自定義類加載器(User Defined Class Loader):由用戶自定義類的加載規則,可以手動控制加載過程中的步驟。
  2、ClassLoader的工作原理
  類加載分為裝載、鏈接、初始化三步。
  a.裝載
  通過類的全限定名和ClassLoader加載類,主要是將指定的.class文件加載至JVM。當類被加載以后,在JVM內部就以“類的全限定名+ClassLoader實例ID”來標明類。
  在內存中,ClassLoader實例和類的實例都位于堆中,它們的類信息都位于方法區。
  裝載過程采用了一種被稱為“雙親委派模型(Parent Delegation Model)” 的方式,當一個ClassLoader要加載類時,它會先請求它的雙親ClassLoader(其實這里只有兩個ClassLoader,所以稱為父 ClassLoader可能更容易理解)加載類,而它的雙親ClassLoader會繼續把加載請求提交再上一級的ClassLoader,直到啟動類加 載器。只有其雙親ClassLoader無法加載指定的類時,它才會自己加載類。
  雙親委派模型是JVM的第一道安全防線,它保證了類的安全加載,這里同時依賴了類加載器隔離的原理:不同類加載器加載的類之間是無法直接交互的,即 使是同一個類,被不同的ClassLoader加載,它們也無法感知到彼此的存在。這樣即使有惡意的類冒充自己在核心包(例如java.lang)下,由 于它無法被啟動類加載器加載,也造成不了危害。
  由此也可見,如果用戶自定義了類加載器,那就必須自己保障類加載過程中的安全。
  b.鏈接
  鏈接的任務是把二進制的類型信息合并到JVM運行時狀態中去。
  鏈接分為以下三步:
  a.驗證:校驗.class文件的正確性,確保該文件是符合規范定義的,并且適合當前JVM使用。
  b.準備:為類分配內存,同時初始化類中的靜態變量賦值為默認值。
  c.解析(可選):主要是把類的常量池中的符號引用解析為直接引用,這一步可以在用到相應的引用時再解析。
  c.初始化
  初始化類中的靜態變量,并執行類中的static代碼、構造函數。
  JVM規范嚴格定義了何時需要對類進行初始化:
  a、通過new關鍵字、反射、clone、反序列化機制實例化對象時。
  b、調用類的靜態方法時。
  c、使用類的靜態字段或對其賦值時。
  d、通過反射調用類的方法時。
  e、初始化該類的子類時(初始化子類前其父類必須已經被初始化)。
  f、JVM啟動時被標記為啟動類的類(簡單理解為具有main方法的類)。
  三、Java棧(Java Stack)
  Java棧由棧幀組成,一個幀對應一個方法調用。調用方法時壓入棧幀,方法返回時彈出棧幀并拋棄。Java棧的主要任務是 存儲方法參數、局部變量、中間運算結果,并且提供部分其它模塊工作需要的數據。前面已經提到Java棧是線程私有的,這就保證了線程安全性,使得程序員無 需考慮棧同步訪問的問題,只有線程本身可以訪問它自己的局部變量區。
  它分為三部分:局部變量區、操作數棧、幀數據區。
  1、局部變量區
  局部變量區是以字長為單位的數組,在這里,byte、short、char類型會被轉換成int類型存儲,除了long和 double類型占兩個字長以外,其余類型都只占用一個字長。特別地,boolean類型在編譯時會被轉換成int或byte類型,boolean數組會 被當做byte類型數組來處理。局部變量區也會包含對象的引用,包括類引用、接口引用以及數組引用。
  局部變量區包含了方法參數和局部變量,此外,實例方法隱含第一個局部變量this,它指向調用該方法的對象引用。對于對象,局部變量區中永遠只有指向堆的引用。
  2、操作數棧
  操作數棧也是以字長為單位的數組,但是正如其名,它只能進行入棧出棧的基本操作。在進行計算時,操作數被彈出棧,計算完畢后再入棧。
  3、幀數據區
  幀數據區的任務主要有:
  a.記錄指向類的常量池的指針,以便于解析。
  b.幫助方法的正常返回,包括恢復調用該方法的棧幀,設置PC寄存器指向調用方法對應的下一條指令,把返回值壓入調用棧幀的操作數棧中。
  c.記錄異常表,發生異常時將控制權交由對應異常的catch子句,如果沒有找到對應的catch子句,會恢復調用方法的棧幀并重新拋出異常。
  局部變量區和操作數棧的大小依照具體方法在編譯時就已經確定。調用方法時會從方法區中找到對應類的類型信息,從中得到具體方法的局部變量區和操作數棧的大小,依此分配棧幀內存,壓入Java棧。

免責聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,也不承認相關法律責任。如果您發現本社區中有涉嫌抄襲的內容,請發送郵件至:operations@xinnet.com進行舉報,并提供相關證據,一經查實,本站將立刻刪除涉嫌侵權內容。

免費咨詢獲取折扣

Loading
主站蜘蛛池模板: 亚洲春色av无码专区最| 国产av无码专区亚洲版综合| 狠狠色丁香五月综合缴情婷婷五月 | 日本无卡无吗二区三区入口| 欧美人禽zozo动人物杂交| 精品国产乱码久久久久久口爆网站 | 久久嫩草影院免费看| 亚洲国产成人无码专区| 国产两女互慰高潮视频在线观看| 精品剧情v国产在线观看| 无码国产精品一区二区免费久久 | 亚洲一区二区制服在线| aaa午夜级特黄日本大片| 亚洲高请码在线精品av| 免费国产污网站在线观看不要卡 | 久久国产热精品波多野结衣av | 丰满护士巨好爽好大乳| 久久精品99久久香蕉国产| 欧美日韩精品乱国产| 在线无码中文字幕一区| 精品国际久久久久999波多野| 欧美性做爰片免费视频看| 久久九九有精品国产尤物| 亚洲精品无码av人在线观看国产| 任你躁国产自任一区二区三区| 色噜噜狠狠色综合网| 欧美成aⅴ人高清免费| 东京热无码av男人的天堂| 国产在线精品99一区不卡| 国精产品一品二品国在线| 亚洲欧美日韩一区二区三区在线| 四虎国产精品永久在线动漫| 国产精品色婷婷亚洲综合看片| 中文无码天天av天天爽| av中文无码韩国亚洲色偷偷| 亚洲高清成人aⅴ片777| 狠狠色婷婷丁香综合久久韩国电影| 看曰本女人大战黑人视频| 亚洲一区二区三区高清在线看 | 亚洲性夜夜摸人人天天| 久久精品国产自在天天线|