初識JVM(簡單易懂),解開JVM神秘的面紗

目錄

?

一、什么是JVM(Java虛擬機)?

二、JVM的功能

三、JVM的功能-即時編譯?

四、常見的JVM

五、JVM的組成

五、JVM的工作流程

????????參考資料


一、什么是JVM(Java虛擬機)?

在Java的世界里,Java虛擬機(JVM)扮演著至關重要的角色。它不僅是Java程序運行的環境,更是實現“一次編寫,到處運行”的關鍵。本文將深入探討JVM的核心組成部分,從類加載到執行引擎,解開JVM神秘的面紗。

?JVM本質上是一個運行在計算機上的程序,他的職責是運行Java字節碼文件

JVM,即Java虛擬機,是一個用于執行Java字節碼的虛擬計算機。它是在硬件或操作系統上構建的一個軟件層,使Java字節碼可以在不同的平臺上運行。即時編譯(Just-In-Time compilation)是JVM的一個關鍵功能,它允許JVM在運行時將字節碼編譯成本地代碼,以提高程序的性能。

即時編譯的主要功能如下:

  1. 預編譯(Compile-Ahead-Of-Time):JVM首先將Java源代碼編譯成字節碼,然后這些字節碼在運行時被即時編譯成本地代碼。這種預編譯的方式使得程序在第一次運行時不需要進行編譯,從而提高了程序的啟動速度。
  2. 熱點代碼優化:JVM通過熱點代碼優化技術來提高程序的運行效率。熱點代碼是指被頻繁執行的代碼。JVM在運行時收集這些熱點代碼的執行信息,并將它們編譯成更高效的本地代碼。這種優化可以顯著提高程序的性能,特別是對于那些頻繁運行的代碼。
  3. 動態編譯:即時編譯還支持動態編譯。這意味著JVM可以根據程序在運行時的行為動態地調整編譯策略。例如,如果某個方法沒有被頻繁調用,那么JVM可以暫時不將其編譯成本地代碼,以節省資源。相反,如果某個方法被頻繁調用,JVM可以將其優先編譯成本地代碼,以提高程序的運行效率。
  4. 內存管理和垃圾回收:JVM還提供了內存管理和垃圾回收的功能。這些功能可以幫助程序員更好地管理內存資源,并提高程序的可靠性。

總之,即時編譯是JVM的一個重要功能,它可以幫助程序員提高程序的性能和可靠性。通過將Java字節碼編譯成本地代碼,JVM可以減少解釋字節碼所需的時間,從而提高程序的執行速度。同時,即時編譯還可以根據程序在運行時的行為動態地調整編譯策略,以進一步提高程序的性能。

?將字節碼文件轉換成計算機可以看懂的機器碼文件。這就是Java虛擬機的主要功能。

二、JVM的功能

三、JVM的功能-即時編譯?

?JVM可以將熱點的代碼字節指令,保存到內存中,等到再次執行時可以直接調用。

四、常見的JVM

常見的JVM包括HotSpot、JRockit、J9等。

HotSpot是較新的Java虛擬機技術,用來代替JIT(just-in-time compilation,及時編譯)技術,可以大大提高Java運行的性能。HotSpot將常用的部分代碼編譯為本地(原生,native)代碼,這樣顯著提高了性能。它從運行應用中采樣數據,從而可以優化代碼,進而得到良好性能。HotSpot引擎可以集中精力來對HotSpot代碼進行深度優化,從而使這部分代碼的執行更加迅捷。但它的啟動時間較長。

JRockit是BEA公司開發的,可以直接運行在自家Hypervisor系統上的JRockit VM的虛擬化版本,JRockit VM不需要操作系統的支持,或者說它自己本身實現了一個專用操作系統的必要功能,如文件系統、網絡支持等。

IBM J9是IBM開發的Java虛擬機,它也支持即時編譯技術。

我們開發時,基本都會優先選擇使用HotSpot。?

五、JVM的組成

JVM主要組成有四個子系統組成:類加載系統運行時數據區域執行引擎本地方法接口
?

  1. 類加載系統(Class Loading System):

    • 加載(Loading): 加載是指查找字節碼文件,并創建一個Class對象的過程。字節碼文件通常由Java編譯器從Java源代碼生成。
    • 驗證(Verification): 確保字節碼文件符合Java語言規范,并且不包含不安全或非法的代碼。
    • 準備(Preparation): 為類的靜態變量分配內存并設置默認初始值。
    • 解析(Resolution): 將常量池中的符號引用替換為直接引用,使得各個類之間能夠正確地引用。
  2. 執行引擎(Execution Engine):

    • 解釋器(Interpreter): 將字節碼文件逐行解釋為機器碼并執行。
    • 即時編譯器(Just-In-Time Compiler,JIT): 將整個字節碼文件編譯為機器碼,提高執行速度。
    • 棧操作(Stack Operations): 使用操作棧進行方法調用、參數傳遞等。
  3. 本地方法接口(Native Interface):

    • 允許Java應用程序調用本地方法(通常使用C或C++編寫的代碼)。Java的本地方法接口允許Java代碼與本地庫進行交互,實現了Java與其他語言的銜接。JVM通過本地庫接口與操作系統提供的庫進行交互,保證了Java程序的可移植性。
  4. 運行時數據區域(Runtime Data Area):

    • 方法區(Method Area): 存儲類的結構信息,如類的字段、方法信息。
    • 堆(Heap): 存儲對象實例,包括程序運行時創建的對象。
    • 棧(Stack): 存儲局部變量、方法調用和返回地址。
    • 程序計數器(Program Counter): 記錄當前線程執行的字節碼行號。
    • 本地方法棧(Native Method Stack): 執行本地方法時使用的棧。

Java程序能夠在不同平臺上實現“一次編寫,到處運行”的特性。類加載系統負責加載和驗證Java類,執行引擎負責執行Java代碼,本地方法接口提供了與底層系統的交互能力,而運行時數據區域存儲程序執行時的數據。JVM通過本地庫接口與操作系統提供的庫進行交互,保證了Java程序的可移植性。

以上圖來源于黑馬課件?

此圖來源于《深入理解Java虛擬機》?

五、JVM的工作流程

JVM的工作流程通常包括以下幾個步驟:

  1. 加載(Loading)
    加載階段是JVM啟動的第一個階段,它負責從系統中加載Java類和接口的定義信息。加載階段的主要任務是找到并加載Java類和接口的定義信息,并將其存儲在內存中。這些定義信息包括類的成員變量、成員方法、構造函數等。在加載階段,JVM還會對類的定義信息進行驗證,以確保其符合Java語言的規范。
  2. 鏈接(Linking)
    鏈接階段是加載階段的后續階段,它負責驗證類的定義信息、為類的成員變量分配內存并設置默認值,以及解析類的符號引用。在鏈接階段,JVM會對類進行一系列的驗證,以確保其符合Java語言的規范。如果驗證不通過,則會拋出異常。此外,鏈接階段還會為類的成員變量分配內存并設置默認值,以及解析類的符號引用。符號引用是指用符號來引用類、方法、變量等的一種方式。
  3. 初始化(Initialization)
    初始化階段是鏈接階段的后續階段,它負責執行類的初始化代碼。初始化階段的主要任務是執行類的初始化代碼,包括靜態初始化塊和靜態初始化方法。在初始化階段,JVM會執行類的靜態代碼塊和靜態變量的初始化代碼。如果存在多個靜態變量或靜態代碼塊,則會按照它們在類中的順序依次執行。
  4. 執行(Execution)
    執行階段是JVM的核心階段,它負責執行Java程序的字節碼指令。執行階段的主要任務是執行Java程序的字節碼指令,包括對成員變量的讀寫操作、方法的調用等。在執行階段,JVM會根據程序的指令逐條執行字節碼指令,從而實現Java程序的運行。
  5. 卸載(Unloading)
    卸載階段是JVM的最后一個階段,它負責卸載不再被使用的Java類和接口的定義信息。卸載階段的主要任務是回收被卸載的類占用的內存空間,以便重新被使用。在卸載階段,JVM會回收被卸載的類占用的內存空間,以便重新被使用。

以上就是JVM的基本工作流程,不同的JVM實現可能會有一些差異,比如內存分配策略、垃圾收集器類型等。

深入了解Java虛擬機,我們不僅能夠更好地理解Java程序的運行機制,還能夠優化程序性能、解決內存泄漏等問題。JVM的神秘面紗下,是一個復雜而高效的執行環境,為Java的成功貢獻著重要的力量。讓我們在編寫Java程序的同時,更加深入地認識JVM,為程序的優化和調優提供更多的可能性。

參考資料

  • The Java? Virtual Machine Specification
  • 深入理解Java虛擬機(第三版)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161182.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161182.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161182.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼文檔瀏覽器 Dash mac中文版軟件特色

Dash mac是一個基于 Python 的 web 應用程序框架,它可以幫助開發者快速構建數據可視化應用。Dash 的工作原理是將 Python 代碼轉換成 HTML、CSS 和 JavaScript,從而在瀏覽器中呈現交互式的數據可視化界面。Dash 提供了一系列組件,包括圖表、表…

如何將設置為靜態IP的VMware虛擬機進行克隆以便可以復刻相應的環境

一定要關閉需要克隆的虛擬機右鍵要選擇克隆的虛擬機,選擇管理->克隆,進入克隆虛擬機向導 設定克隆出來的虛擬機名稱以及位置,選擇完成 克隆完成之后將會生成虛擬機,示例中生成的虛擬機為ubuntu-dev2 因為原本的虛擬機為靜態ip的…

區域人員超限AI算法的介紹及TSINGSEE視頻智能分析技術的行業應用

視頻AI智能分析已經滲透到人類生活及社會發展的各個方面。從生活中的人臉識別、停車場的車牌識別、工廠園區的翻越圍欄識別、入侵識別、工地的安全帽識別、車間流水線產品的品質缺陷AI檢測等,AI智能分析技術無處不在。在某些場景中,重點區域的人數統計與…

3:kotlin 邏輯控制(Control flow)

向其他語言一樣,kotlin也有循環和邏輯控制 條件判斷(Conditional expressions) kotlin使用if和when來進行條件判斷 如果糾結選擇if還是when,建議使用when,因為它更能提高程序的健壯性 if 普通寫法 fun main() {val…

Java集合拓展01

1、List,Set,Map三者的區別 List:一個有序(元素存入集合的順序和取出的順序一致)容器,元素可以重復,可以插入多個null元素,元素都有索引。常用的實現類有 ArrayList、LinkedList 和…

EMG肌肉信號處理合集 (一)

本文歸納了常見的肌肉信號預處理流程,方便EMG信號的后續分析。使用pyemgpipeline庫 來進行信號的處理。文中使用了 UC Irvine 數據庫的下肢數據。 目錄 1 使用wrappers 定義數據類,來進行后續的操作 2 肌電信號DC偏置去除 3 帶通濾波器處理 4 對肌電…

SpringCloud - 新版淘汰 Ribbon,在 OpenFeign 中整合 LoadBalancer 負載均衡

目錄 一、LoadBalancer 負載均衡 1.1、前言 1.2、LoadBalancer 負載均衡底層實現原理 二、整合 OpenFeign LoadBalancer 2.1、所需依賴 2.2、具體實現 2.3、自定義負載均衡策略 一、LoadBalancer 負載均衡 1.1、前言 在 2020 年以前的 SpringCloud 采用 Ribbon 作為負載…

OOM問題排查+Jvm優化

OOM問題排查: 1、top命令:查看cpu和內存的使用情況。 2、jstat命令:查看YGC和FGC情況,一般都是老年代不夠用。導致OOM 3、jmap命令: 查看哪個類的實例過多,以每個類占用多少了內存。4、jstack 查看線程與線程之間的阻…

Linux用戶名用戶組命令

添加用戶(為sam用戶添加一個主目錄/home/sam) useradd -d /home/sam -m sam新建一個用戶gem,該用戶的登錄shell是/bin/sh,它屬于group用戶組,同時又屬于adm和root用戶組,其中group用戶組是其主組 添加用戶賬號就是在/etc/passwd文件中為新用戶添加一條記…

80基于matlab的小波包熵與模糊C均值聚類的故障診斷,以凱斯西儲大學軸承數據為例進行分析

基于matlab的小波包熵與模糊C均值聚類的故障診斷,以凱斯西儲大學軸承數據為例進行分析。對數據進行小波包分解后重構,然后提取各頻帶能量分布,后計算小波包熵進行故障診斷。輸出特征可視化結果。數據可更換自己的,程序已調通&…

Git遠程庫操作(GitHub)

GitHub 網址:https://github.com/ 創建遠程倉庫 遠程倉庫操作 命令名稱作用git remote -v查看當前所有遠程地址別名git remote add 別名 遠程地址起別名git push 別名 分支推送本地分支上的內容到遠程倉庫git clone 遠程地址將遠程倉庫的內容克隆到本地git pull 別…

文件格式校驗

json格式校驗 非嚴格模式 json.loads(data, strictFalse) 如果strict為false(默認值為True),則字符串中允許使用控制字符。此上下文中的控制字符是那些字符代碼在0–31范圍內的字符,包括“\t”(制表符)、“…

基于STM32的色彩識別與分類算法優化

基于STM32的色彩識別與分類算法優化是一項與圖像處理和機器學習相關的研究任務,旨在實現高效的色彩識別和分類算法在STM32微控制器上的運行。本文將介紹基于STM32的色彩識別與分類算法優化的原理和實現步驟,并提供相應的代碼示例。 1. 色彩識別與分類概…

[SIGGRAPH-23] 3D Gaussian Splatting for Real-Time Radiance Field Rendering

pdf | proj | code 本文提出一種新的3D數據表達形式3D Gaussians。每個Gaussian由以下參數組成:中心點位置、協方差矩陣、可見性、顏色。通過世界坐標系到相機坐標系,再到圖像坐標系的仿射關系,可將3D Gaussian映射到相機坐標系,通…

.NET面試題2

1.請解釋一下C#中的委托(Delegate)。 委托是一種類型安全的函數指針,它可以將方法作為參數傳遞或存儲在變量中。通過委托,可以實現方法的回調、事件處理等功能。委托在C#中使用delegate關鍵字進行聲明,可以根據方法簽名…

c語言:用迭代法解決遞歸問題

題目&#xff1a; 解釋&#xff1a;題目的意思就是用迭代法的空間和時間復雜的太高了&#xff0c;需要我們減小空間與時間的復雜度&#xff0c;我就想到了迭代法&#xff0c;思路和代碼如下&#xff1a; #include <stdio.h> //這里是遞歸法轉迭代法 int main() {int x,i…

Rust語言特性探秘:宏的魔力

大家好&#xff01;我是lincyang。 今天我們繼續深入探討Rust語言中的一個有趣而強大的特性——宏&#xff08;Macros&#xff09;。 宏在Rust中扮演著特殊的角色&#xff0c;不僅提高了代碼的靈活性&#xff0c;還增強了代碼的可重用性。接下來&#xff0c;我們會通過具體的…

[ 云計算 | AWS 實踐 ] 基于 Amazon S3 協議搭建個人云存儲服務

本文收錄于【#云計算入門與實踐 - AWS】專欄中&#xff0c;收錄 AWS 入門與實踐相關博文。 本文同步于個人公眾號&#xff1a;【云計算洞察】 更多關于云計算技術內容敬請關注&#xff1a;CSDN【#云計算入門與實踐 - AWS】專欄。 本系列已更新博文&#xff1a; [ 云計算 | …

Redis-Redis緩存高可用集群

1、Redis集群方案比較 哨兵模式 在redis3.0以前的版本要實現集群一般是借助哨兵sentinel工具來監控master節點的狀態&#xff0c;如果master節點異常&#xff0c;則會做主從切換&#xff0c;將某一臺slave作為master&#xff0c;哨兵的配置略微復雜&#xff0c;并且性能和高可…

深信服技術認證“SCSA-S”劃重點:信息收集

為幫助大家更加系統化地學習網絡安全知識&#xff0c;以及更高效地通過深信服安全服務認證工程師考核&#xff0c;深信服特別推出“SCSA-S認證備考秘笈”共十期內容&#xff0c;“考試重點”內容框架&#xff0c;幫助大家快速get重點知識~ 劃重點來啦 深信服安全服務認證工程師…