亚洲综合在线一区二区三区-日韩超碰人人爽人人做人人添-麻豆国产精品久久人妻-无码人妻丰满熟妇啪啪-天堂精品一区二区三区-99久久综合狠狠综合久久aⅴ

×
新網 > 虛擬主機 > 正文

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

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

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

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

<div>  四、本地方法棧(Native Method Stack)
  本地方法棧類似于Java棧,主要存儲了本地方法調用的狀態。在Sun JDK中,本地方法棧和Java棧是同一個。
8587306230441712901.jpg
  五、方法區(Method Area)
  類型信息和類的靜態變量都存儲在方法區中。方法區中對于每個類存儲了以下數據:
  a.類及其父類的全限定名(java.lang.Object沒有父類)
  b.類的類型(Class or Interface)
  c.訪問修飾符(public, abstract, final)
  d.實現的接口的全限定名的列表
  e.常量池
  f.字段信息
  g.方法信息
  h.靜態變量
  i.ClassLoader引用
  j.Class引用
  可見類的所有信息都存儲在方法區中。由于方法區是所有線程共享的,所以必須保證線程安全,舉例來說,如果兩個類同時要加載一個尚未被加載的類,那么一個類會請求它的ClassLoader去加載需要的類,另一個類只能等待而不會重復加載。
  此外為了加快調用方法的速度,通常還會為每個非抽象類創建私有的方法表,方法表是一個數組,存放了實例可能被調用的實例方法的直接引用。方法表對于多態有非常重要的意義,具體可以參照《淺談多態機制的意義及實現》一文中“多態的實現”一節。
  在Sun JDK中,方法區對應了持久代(Permanent Generation),默認最小值為16MB,最大值為64MB。
  六、堆(Heap)
  堆用于存儲對象實例以及數組值。堆中有指向類數據的指針,該指針指向了方法區中對應的類型信息。堆中還可能存放了指向方法 表的指針。堆是所有線程共享的,所以在進行實例化對象等操作時,需要解決同步問題。此外,堆中的實例數據中還包含了對象鎖,并且針對不同的垃圾收集策略, 可能存放了引用計數或清掃標記等數據。
  在堆的管理上,Sun JDK從1.2版本開始引入了分代管理的方式。主要分為新生代、舊生代。分代方式大大改善了垃圾收集的效率。
  1、新生代(New Generation)
  大多數情況下新對象都被分配在新生代中,新生代由Eden Space和兩塊相同大小的Survivor Space組成,后兩者主要用于Minor GC時的對象復制(Minor GC的過程在此不詳細討論)。
  JVM在Eden Space中會開辟一小塊獨立的TLAB(Thread Local Allocation Buffer)區域用于更高效的內存分配,我們知道在堆上分配內存需要鎖定整個堆,而在TLAB上則不需要,JVM在分配對象時會盡量在TLAB上分配,以提高效率。
  2、舊生代(Old Generation/Tenuring Generation)
  在新生代中存活時間較久的對象將會被轉入舊生代,舊生代進行垃圾收集的頻率沒有新生代高。
  七、執行引擎
  執行引擎是JVM執行Java字節碼的核心,執行方式主要分為解釋執行、編譯執行、自適應優化執行、硬件芯片執行方式。
  JVM的指令集是基于棧而非寄存器的,這樣做的好處在于可以使指令盡可能緊湊,便于快速地在網絡上傳輸(別忘了Java最初就是為網絡設計的),同 時也很容易適應通用寄存器較少的平臺,并且有利于代碼優化,由于Java棧和PC寄存器是線程私有的,線程之間無法互相干涉彼此的棧。每個線程擁有獨立的 JVM執行引擎實例。
  JVM指令由單字節操作碼和若干操作數組成。對于需要操作數的指令,通常是先把操作數壓入操作數棧,即使是對局部變量賦值,也會先入棧再賦值。注意這里是“通常”情況,之后會講到由于優化導致的例外。
  1、解釋執行
  和一些動態語言類似,JVM可以解釋執行字節碼。Sun JDK采用了token-threading的方式,感興趣的同學可以深入了解一下。
  解釋執行中有幾種優化方式:
  a.棧頂緩存
  將位于操作數棧頂的值直接緩存在寄存器上,對于大部分只需要一個操作數的指令而言,就無需再入棧,可以直接在寄存器上進行計算,結果壓入操作數站。這樣便減少了寄存器和內存的交換開銷。
  b.部分棧幀共享
  被調用方法可將調用方法棧幀中的操作數棧作為自己的局部變量區,這樣在獲取方法參數時減少了復制參數的開銷。
  c.執行機器指令
  在一些特殊情況下,JVM會執行機器指令以提高速度。
  2、編譯執行
  為了提升執行速度,Sun JDK提供了將字節碼編譯為機器指令的支持,主要利用了JIT(Just-In-Time)編譯器在運行時進行編譯,它會在第一次執行時編譯字節碼為機器碼并緩存,之后就可以重復利用。Oracle JRockit采用的是完全的編譯執行。
  3、自適應優化執行
  自適應優化執行的思想是程序中10%~20%的代碼占據了80%~90%的執行時間,所以通過將那少部分代碼編譯為優化過 的機器碼就可以大大提升執行效率。自適應優化的典型代表是Sun的Hotspot VM,正如其名,JVM會監測代碼的執行情況,當判斷特定方法是瓶頸或熱點時,將會啟動一個后臺線程,把該方法的字節碼編譯為極度優化的、靜態鏈接的 C++代碼。當方法不再是熱區時,則會取消編譯過的代碼,重新進行解釋執行。
  自適應優化不僅通過利用小部分的編譯時間獲得大部分的效率提升,而且由于在執行過程中時刻監測,對內聯代碼等優化也起到了很大的作用。由于面向對象的多態性,一個方法可能對應了很多種不同實現,自適應優化就可以通過監測只內聯那些用到的代碼,大大減少了內聯函數的大小。
  Sun JDK在編譯上采用了兩種模式:Client和Server模式。前者較為輕量級,占用內存較少。后者的優化程序更高,占用內存更多。
  在Server模式中會進行對象的逃逸分析,即方法中的對象是否會在方法外使用,如果被其它方法使用了,則該對象是逃逸的。對于非逃逸對象,JVM 會在棧上直接分配對象(所以對象不一定是在堆上分配的),線程獲取對象會更加快速,同時當方法返回時,由于棧幀被拋棄,也有利于對象的垃圾收集。 Server模式還會通過分析去除一些不必要的同步,感興趣的同學可以研究一下Sun JDK 6引入的Biased Locking機制。
  此外,執行引擎也必須保證線程安全性,因而JMM(Java Memory Model)也是由執行引擎確保的。

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

免費咨詢獲取折扣

Loading
主站蜘蛛池模板: 人妻少妇无码精品专区| 无码任你躁久久久久久老妇蜜桃| 国产草草影院ccyycom| 国产亚洲精品久久久久久一区二区| 国语精品自产拍在线观看网站| 国产一区污污在线观看| 国产福利一区二区三区高清| 精品国产肉丝袜在线拍国语| 国产强伦姧在线观看无码| 精品人妻中文av一区二区三区| 久久青草成人综合网站| 国产怡红院一区二区| 国产成人精品日本亚洲专区| 亚洲精品无码久久不卡| 粗壮挺进邻居人妻无码| 人妻精品久久无码区| 午夜福利麻豆国产精品| 亚洲欧美综合区自拍另类| 久久av喷潮久久av高清| 骚虎av在线网站| 麻豆人妻无码性色av专区| 亚洲熟妇av午夜无码不卡| 亚洲a∨国产av综合av| 国产av午夜精品一区二区三| 中文天堂资源在线www| 人人爽人人爽人人片av免费| 伊人狠狠色丁香婷婷综合| 无码av片在线观看免费| 亚洲欧美v国产一区二区| 国产精品无码制服丝袜| 欧美变态口味重另类在线视频| 国产男女猛烈无遮挡免费视频| 中文字幕无线码免费人妻| 亚洲色欲色欲www在线看小说| 一区二区三区鲁丝不卡麻豆| 亚洲国产精品悠悠久久琪琪| 欧美日本一区二区四区| 免费国产精品视频美女一区| 国产乱码人妻一区二区三区| 成人免费无码不卡毛片| 精品国产乱码一区二区三区|