JVM、JRE和JDK有哪些區(qū)別和聯(lián)系

本篇內(nèi)容介紹了“JVM、JRE和JDK有哪些區(qū)別和聯(lián)系”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)服務(wù)項目包括肅南裕固族自治網(wǎng)站建設(shè)、肅南裕固族自治網(wǎng)站制作、肅南裕固族自治網(wǎng)頁制作以及肅南裕固族自治網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,肅南裕固族自治網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到肅南裕固族自治省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

1、JVM、JRE和JDK的區(qū)別和聯(lián)系

這個基本是步入java世界的入門級知識認知,首先我們來看一下來自java官網(wǎng)的一張圖:

JVM、JRE和JDK有哪些區(qū)別和聯(lián)系
從這張圖里我們基本就可以看出“JRE”是運行Java語言編寫的程序所不可缺少的運行環(huán)境。有了JRE我們寫的java程序才可以運行起來被用戶所使用。

而“JDK”俗稱java開發(fā)工具包,它包括了Java運行環(huán)境JRE(Java Runtime Envirnment)以及一堆Java工具(javac/java/jdb等)和Java基礎(chǔ)的類庫(即Java API 包括rt.jar)。

但不管是JRE還是JDK都是以JVM為基石的??梢哉fJVM是java程序可以在某臺機器上得以運行的最底層的保障。

2、那么什么是JVM?它的主要作用又是什么?

JVM是Java Virtual Machine(Java虛擬機)的縮寫,它的用途簡單的說就是它能讓我們寫的java程序在不同的操作系統(tǒng)的不同CPU上運行。我們寫的java程序會利用開發(fā)工具(如Intellij idea)把它編譯成.class文件,但這個class文件是不能直接被操作系統(tǒng)識別運行的,需要利用jvm按jvm規(guī)范將編譯好的.class文件轉(zhuǎn)變成機器語言,再交由操作系統(tǒng)提交給cpu去執(zhí)行。

JVM、JRE和JDK有哪些區(qū)別和聯(lián)系

用一句話評價JVM的主要作用就是:JVM屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息,使得Java程序只需生成在Java虛擬機上運行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行。

3、這么牛的JVM的核心功能有哪些?

JVM中核心的功能總體有三塊:

  1. 類加載器:在JVM啟動時或者在類運行時將需要的class文件加載到JVM中

  2. 執(zhí)行引擎:負責(zé)執(zhí)行class文件,包括分配運行時數(shù)據(jù)區(qū)(如程序計數(shù)器、本地方法棧和虛擬棧)和 最終將class中的字節(jié)碼指令轉(zhuǎn)為機器指令通過操作系統(tǒng)交給CPU執(zhí)行

  3. 垃圾回收器:對JVM的堆內(nèi)存進行管理,及時回收調(diào)無用的資源釋放內(nèi)存空間

4、JVM類的加載機制和過程?

首先,我們談?wù)勯_發(fā)工具編譯生成的class文件是如何被JVM加載的。所謂的類加載機制其實就是:虛擬機(JVM)把class文件加載到內(nèi)存中,然后對它進行正確性的校驗,檢查通過再進行解析和初始化,最終把class文件變成一個內(nèi)存中可以直接使用的java.lang.Class對象。

從一個class文件的裝載到銷毀,它的生命周期基本可以分為以下五個階段:裝載、鏈接(驗證、準備和解析)、初始化、使用和卸載。

JVM、JRE和JDK有哪些區(qū)別和聯(lián)系

  1. 裝載:裝載(Load)階段總共有三項工作

    (1)通過類的全限定名獲取其定義的二進制字節(jié)流,需要借助類裝載器(ClassLoader)完成;

    (2)在運行時數(shù)據(jù)區(qū)的“方法區(qū)”中分配一塊區(qū)域保存這個類的信息,包括類的基本信息、常量和靜態(tài)變量等等;

    (3)在“Java堆”內(nèi)存上生成一個該類的java.lang.Class對象,用于對外暴露使用該類的入口。

  2. 鏈接:鏈接(link)階段同樣有三項工作

    (1)驗證(Verify),驗證文件格式、元數(shù)據(jù)、字節(jié)碼和符號引用,以保證被加載類的準確性;

    (2)準備(Prepare),為靜態(tài)變量分配內(nèi)存并初始化為默認值。

    JVM、JRE和JDK有哪些區(qū)別和聯(lián)系

    (3)解析(Resolve),解析階段是虛擬機將常量池內(nèi)的符號引用替換為直接引用的過程。解析動作主要針對類或接口、字段、類方法、接口方法、方法類型、方法句柄和調(diào)用限定符7類符號引用進行。

  3. 初始化:初始化(Initialize)階段所做的工作就是對類的靜態(tài)成員變量和靜態(tài)方法進行初始化賦值或調(diào)用。

比如上面的靜態(tài)變量age初始化之后的值變?yōu)榱?0。

在裝載階段的第(2),(3)步可以發(fā)現(xiàn)有運行時數(shù)據(jù)區(qū),堆,方法區(qū)等名詞,那么究竟什么是“運行時數(shù)據(jù)區(qū)”,它有哪些結(jié)構(gòu)構(gòu)成?

5、什么是JVM運行時數(shù)據(jù)區(qū)?及其邏輯結(jié)構(gòu)

“運行時數(shù)據(jù)區(qū)”是JVM在執(zhí)行Java程序的過程中出于內(nèi)存管理方面的目的,在設(shè)計上把內(nèi)存分為若干個不同的區(qū)域。這些區(qū)域有著各自的用途,有的區(qū)域生命周期跟虛擬機一樣,隨著虛擬機進程的啟動而存在,伴隨這虛擬機的進程結(jié)束而消亡。而有些區(qū)域則依賴用戶線程的啟動和結(jié)束而建立和銷毀。具體如下圖:

JVM、JRE和JDK有哪些區(qū)別和聯(lián)系

  1. 方法區(qū)(Method Area):
    (1)用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù);

(2)方法區(qū)是各個線程共享的內(nèi)存區(qū)域,在虛擬機啟動時創(chuàng)建,因為同一個class類信息只需要加載一份就夠了;

(3)java虛擬機規(guī)范中把方法區(qū)描述為堆內(nèi)存的一個邏輯部分,但它有另外一個別名叫“非堆”,用于與java堆區(qū)分開來。在JDK8之前方法區(qū)叫做Perm space,在JDK8及以后叫做Metaspace(即元數(shù)據(jù)區(qū))。

  1. 堆(Heap):Java堆是被所有線程共享,虛擬機啟動時創(chuàng)建,此內(nèi)存區(qū)域唯一的目的就是存放對象實例,在Java虛擬機規(guī)范中的描述是:所有的對象實例以及數(shù)組都要在堆上分配,但是隨著JIT編譯器的發(fā)展和逃逸分析技術(shù)逐漸成熟,棧上分配,標(biāo)量替換優(yōu)化技術(shù)將會導(dǎo)致一些微妙的變化發(fā)生,所有的對象都分配在堆上也就變得不那么絕對了。

  1. 虛擬機棧(Java Virtual Machine Stacks):虛擬機棧是線程私有的或者說是獨有的,隨著線程的創(chuàng)建而創(chuàng)建。一個線程的運行狀態(tài)(正在調(diào)用哪個方法),就是由這個線程對應(yīng)的虛擬機棧來保存的。

每一個被線程執(zhí)行的方法,為虛擬機棧中的一個棧幀,調(diào)用一個方法,就會向棧中壓入一個棧幀;一個方法調(diào)用完成,就會把該棧幀從棧中彈出。如下圖解:

JVM、JRE和JDK有哪些區(qū)別和聯(lián)系

  1. 程序計數(shù)器(The Pc Register):我們都知道一個JVM進程中有多個線程在執(zhí)行,而線程中的內(nèi)容是否能夠擁有執(zhí)行權(quán),是根據(jù)CPU調(diào)度來的。假如線程A正在執(zhí)行到某個地方,突然失去了CPU的執(zhí)行權(quán),切換到線程B了,然后當(dāng)線程A再獲得CPU執(zhí)行權(quán)的時候,怎么能繼續(xù)執(zhí)行呢?這就是需要在線程中維護一個變量,記錄線程執(zhí)行到的位置,這就是程序計數(shù)器。

  2. 本地方法棧(Native Method Stacks):本地方法棧與虛擬機棧所發(fā)揮的作用非常相似,他們之間的區(qū)別不過是虛擬機棧為虛擬機執(zhí)行Java方法(字節(jié)碼)服務(wù),而本地方法棧則為虛擬機中使用到的native方法服務(wù)。即如果當(dāng)前線程執(zhí)行的方法是Native類型的,這些方法就會在本地方法棧中執(zhí)行。

    JVM、JRE和JDK有哪些區(qū)別和聯(lián)系

總結(jié)一下,就JVM的設(shè)計規(guī)范,從使用用途角度JVM的內(nèi)存大體的分為:線程私有內(nèi)存區(qū) 和 線程共享內(nèi)存區(qū)。

JVM、JRE和JDK有哪些區(qū)別和聯(lián)系

線程私有內(nèi)存區(qū)在類加載器編譯某個class文件時就確定了執(zhí)行時需要的“程序計數(shù)器”和“虛擬棧幀”等所需的空間,并且會伴隨著當(dāng)前執(zhí)行線程的產(chǎn)生而產(chǎn)生,執(zhí)行線程的消亡而消亡,因此“線程私有內(nèi)存區(qū)”并不需要考慮內(nèi)存管理和垃圾回收的問題。

線程共享內(nèi)存區(qū)在虛擬機啟動時創(chuàng)建,被所有線程共享,是Java虛擬機所管理內(nèi)存中最應(yīng)該關(guān)注的和最大的一塊。

“JVM、JRE和JDK有哪些區(qū)別和聯(lián)系”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

本文題目:JVM、JRE和JDK有哪些區(qū)別和聯(lián)系
本文地址:http://muchs.cn/article20/isjejo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站設(shè)計公司、網(wǎng)站制作域名注冊、網(wǎng)站收錄、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化