| 前言 JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個虛構的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實作的, ![]() JVM屏蔽了與具體作業系統平臺相關的資訊,使Java程式只需生成在Java虛擬機上一次編譯,多次運行,具有跨平臺性,JVM在執行位元組碼時,實際上最侄訓是把位元組碼解釋成具體平臺上的機器指令執行, Java虛擬機包括一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法區, 本文將簡述以下內容:
正文 JVM是什么 JDK、JRE和JVM對比 ![]() JVM,JRE,JDK 都是 java 語言的支柱,他們分工協作,但不同的是 Jdk 和 JRE 是真實存在的,而 JVM 是一個抽象的概念,并不真實存在, JDK JDK(Java Development Kit) 是 Java 語言的軟體開發工具包(SDK),JDK 物理存在,是 programming tools、JRE 和 JVM 的一個集合, ![]() JRE JRE(Java Runtime Environment)Java 運行時環境,JRE 是物理存在的,主要由Java API 和 JVM 組成,提供了用于執行 java 應用程式最低要求的環境, ![]() JVM JVM是一種用于計算設備的規范,它是一個虛構的計算機的軟體實作,簡單的說,JVM是運行byte code位元組碼程式的一個容器, JVM的特點
JVM位元組碼 JVM使用Java位元組碼的方式,作為Java 用戶語言 和 機器語言 之間的中間語言,實作一個通用的、 機器無關 的執行平臺, JVM能干什么 基于安全方面考慮,JVM 要求在 class 檔案中使用強制性的語法和約束,但任意一門語言都可以轉換為被 JVM 接受的有效的 class 檔案,作為一個通用的、機器無關的執行平臺,任何其他語言的實作者都可將 JVM 當作他的語言產品交付媒介, JVM 中執行程序如下:
JVM生命周期
JVM組成架構 JAVA 代碼執行程序如下: ![]() 1. 類加載器(Class Loader) 類加載器 負責加載程式中的型別(類和介面),并賦予唯一的名字予以標識, JDK 默認提供的三種 ClassLoader如下: ![]() 類加載器的關系
類加載器的作用 Class Loader 實作 負責加載 Bootstrap Loader C++ %JAVA_HOME%/jre/lib, %JAVA_HOME%/jre/classes以及-Xbootclasspath引數指定的路徑以及中的類 Extension ClassLoader Java %JAVA_HOME%/jre/lib/ext,路徑下的所有classes目錄以及java.ext.dirs系統變數指定的路徑中類別庫 Application ClassLoader Java Classpath所指定的位置的類或者是jar檔案,它也是Java程式默認的類加載器 雙親委托機制 Java中ClassLoader的加載采用了雙親委托機制,采用雙親委托機制加載類的時候采用如下的幾個步驟:
ClassLoader隔離問題 每個類裝載器都有一個自己的命名空間用來保存已裝載的類,當一個類裝載器裝載一個類時,它會通過保存在命名空間里的類全域限定名(Fully Qualified Class Name)進行搜索來檢測這個類是否已經被加載了, JVM 及 Dalvik 對類唯一的識別是 ClassLoader id + PackageName + ClassName,所以一個運行程式中是有可能存在兩個包名和類名完全一致的類的,并且如果這兩個”類”不是由一個 ClassLoader 加載,是無法將一個類的示例強轉為另外一個類的,這就是 ClassLoader 隔離, 雙親委托 是 ClassLoader類一致問題的一種解決方案,也是 Android 差價化開發和熱修復的基礎, 類裝載器特點 Java提供了動態加載特性,在運行時的第一次參考到一個class的時候會對它進行裝載(Loading) 、** 鏈接(Linking)** 和 ** 初始化(Initialization) ** ,而不是在編譯時進行,不同的JVM的實作不同,本文所描述的內容均只限于Hotspot JVM, JVM的類裝載器負責動態裝載,Java的類裝載器有如下幾個特點:
類裝載器程序
![]()
把類中的變數初始化成合適的值,執行靜態初始化程式,把靜態變數初始化成指定的值,
2. 執行引擎(Execution Engine) 通過類裝載器裝載的,被分配到JVM的運行時資料區的位元組碼會被執行引擎執行, 執行引擎 以指令為單位讀取 Java 位元組碼,它就像一個 CPU 一樣,一條一條地執行機器指令,每個位元組碼指令都由一個1位元組的操作碼和附加的操作陣列成,執行引擎 取得一個操作碼,然后根據運算元來執行任務,完成后就繼續執行下一條操作碼, 不過 Java 位元組碼是用一種人類可以讀懂的語言撰寫的,而不是用機器可以直接執行的語言,因此,執行引擎 必須把位元組碼轉換成可以直接被 JVM 執行的語言, 位元組碼 可以通過以下兩種方式轉換成機器語言:
Java 位元組碼是解釋執行的,但是沒有直接在 JVM 宿主執行原生代碼快,為了提高性能,Oracle Hotspot 虛擬機會找到執行最頻繁的位元組碼片段并把它們編譯成原生機器碼,編譯出的原生機器碼被存盤在非堆記憶體的代碼快取中, 通過這種方法(JIT),Hotspot 虛擬機將權衡下面兩種時間消耗:將位元組碼編譯成本地代碼需要的額外時間和解釋執行位元組碼消耗更多的時間, ![]() 這里插入一下 Android 5.0 以后用的 ART 虛擬機使用的是 AOT 機制,
如果對java微服務、分布式、高并發、高可用、大型互聯網架構技術、面試經驗交流,感興趣可以關注我的頭條號,我會在微頭條不定期的發放免費的資料鏈接,這些資料都是從各個技術網站搜集、整理出來的,如果你有好的學習資料可以私聊發我,我會注明出處之后分享給大家,歡迎分享,歡迎評論,歡迎轉發 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/244112.html
標籤:Java
上一篇:看完這篇,你也是字符編碼大神!








