国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - JVM 體系結構詳解

JVM 體系結構詳解

2020-08-27 14:53創心coder Java教程

本文主要介紹了JVM體系結構的相關知識。具有很好的參考價值。下面跟著小編一起來看下吧

JVM 是一種抽象的計算機,基于堆棧架構,它有自己的指令集和內存管理,是 Java 跨平臺的依據,JVM解釋執行字節碼,或將字節碼編譯成本地代碼執行。Java 虛擬機體系結構如下:

JVM 體系結構詳解

Class File

Class File 是平臺無關的二進制文件,包含著能被JVM執行的字節碼,其中多字節采用大端序,字符使用一種改進的UTF-8編碼。Class文件精確的描述了一個類或接口的信息,其中包括:

  • 常量池:數值和字符串字面常量,元數據如類名、方法名稱、參數,以及各種符號引用
  • 方法的字節碼指令,參數個數,局部變量,最大操作數棧深度,異常等信息

Class Loader

類加載器,JVM在類首次使用時動態的加載、鏈接和初始化。JVM默認的加載模型是雙親委派模型,類加載器之間存在父子關系的層次結構,內部使用組合實現。此外還有其他的加載方式,比如Servlet加載,它先嘗試自己加載,不成功再委派上層加載器,類隔離;OSGI加載器之間是一種網狀的依賴關系,沒有上下層的區分,比較靈活。

加載

加載就是將Class文件表示的類或接口,在JVM方法區中創建一個與之對應的java.lang.Class對象,像Class.forName()、ClassLoader.loadClass()、反射都能觸發類加載。當觸發一個類加載時,詳細的過程如下:

  • 檢查類是否已經被加載
  • 將加載請求委派給上層類加載器
  • 自己嘗試搜索類并加載

當ClassLoader在classpath中未找到類文件,會拋出ClassNotFoundException;當類A引用類B,類A已經成功加載,但是加載B時未找到類文件,會拋出NoClassDefFoundError。JVM有以下幾種類加載器:

  • Bootstrap ClassLoader,啟動類加載器,加載 <java_home>\jre\lib 中 Java 核心類庫
  • Extension ClassLoader,擴展類加載器,加載 <java_home>\jre\lib\ext 中的類
  • System ClassLoader,系統類加載器,也叫應用程序類加載器(Application class loader),加載 CLASSPATH 環境變量中的類

鏈接

  • 驗證:確保class文件的正確性。
  • 準備:為類靜態字段分配內存并初始化為默認值,不會執行任何字節碼指令。
  • 解析:將符號引用轉為方法區(運行時常量池)直接引用

初始化

執行類初始化方法,即賦值靜態字段,執行靜態塊,順序按照其定義的先后。父類的靜態域會先于子類靜態域初始化。

至此,一個類或接口被加載到了內存中,JVM會保證整個過程是線程安全的。需要注意的是整個過程沒有涉及到任何實例對象。

運行時數據區

1. Method Area:線程共享,存儲運行時常量池、類字段和方法信息、靜態變量和方法的字節碼,是堆的邏輯組成部分,這部分的垃圾回收是可選的。值得一提的是Hotspot JVM自JDK8之后,調整了這部分內存的內容,class meta-data的分配使用本地內存,interned String和類靜態變量移動到了Java堆。

2. 運行時常量池:對于JVM來說具有核心作用,基本上涉及到方法或字段,JVM就會在運行時常量池中搜索其具體的內存地址。

3. Heap:線程共享,存儲實例對象,實例變量以及數組,是垃圾回收的主要區域。

4. JVM Stack:線程私有,用于存儲棧幀,當方法被調用時會創建一個棧幀入棧,棧幀由以下幾部分組成:

  • 局部變量表:從0開始存儲this、方法參數、局部變量。
  • 操作數棧:方法的工作區,在操作數棧和局部變量之間交換數據,存儲中間結果,操作數棧深度在編譯時就能確定。
  • 幀數據:方法返回值,異常分派,以及當前方法所在類運行時常量池的引用。

5. PC Register:線程私有,保存當前指令地址,執行后指向下一條指令地址。

6. Native Method Stack:線程私有,存儲本地方法信息,C或C++棧。

執行引擎

讀取、翻譯、執行字節碼。JVM基于棧架構,這個棧就是操作數棧,字節碼指令就是通過它進行各種運算。此外還有基于寄存器的虛擬機。

  • Interpreter,翻譯:解釋字節碼比較快,執行慢,缺點是每次方法調用都要重新翻譯解釋一遍。
  • JIT Compiler,即時編譯:找出程序中頻繁調用的熱點方法,將字節碼編譯成本地代碼,提高性能。
  • Garbage Collector,垃圾收集器:回收無效對象,判斷對象是否可回收,可采用不同的垃圾回收算法。

本地方法接口和庫

JNI,調用本地方法,c/c++庫;執行引擎所需的本地方法庫。

小結

主流JVM的實現有Oracle的Hotspot JVM、JRockit以及IBM的JVM。說到JVM調優,默認指的就是Hotspot VM,足見其流行程度。如今搞Java不去了解JVM就顯得有點low了-v-。

要想寫出高質量代碼,不僅要了解JVM,像調優,問題排查等都需要完備的計算機基礎知識,其實無論用什么語言開發,都是一個構建和完善自身計算機知識體系的過程。

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持服務器之家!

原文鏈接:http://www.cnblogs.com/cxcoder/p/6513573.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费黄色网止 | 久久99深爱久久99精品 | 久久不卡| 久久久久网站 | 激情小视频 | 久久国产视频精品 | 国产精品一区二区三区四区 | 欧美视频一区二区三区 | 168黄网| 99久久精品免费看国产四区 | 日韩欧美一级精品久久 | 日本不卡一二三区 | 久久美女视频 | 欧美激情一区二区三级高清视频 | 亚洲视频 欧美视频 | 国产精品永久 | 亚洲精品视频在线观看网站 | 手机在线观看av | 亚洲精品乱码8久久久久久日本 | 黄色片视频免费 | 国产尤物 | 亚洲精品一区二区三区在线观看 | 欧美一级片 | 国产中文字幕在线 | 国产欧美一区二区精品性色 | 国产99精品 | 91久久久久久久久 | 欧美a在线 | 国产精品久久久久久久久久久久久 | 国产一区二区三区在线视频 | 国产精品久久久久一区二区三区 | 国产日韩一区二区 | 免费观看aaa | 亚洲精品久久久久久国产精华液 | 欧美精品区 | 国产99久久精品一区二区永久免费 | 精品免费国产一区二区三区 | 欧美视频区 | 伦理午夜电影免费观看 | 国产毛片区 | 亚洲精品专区 |