溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java常見知識(shí)點(diǎn)中Jvm內(nèi)存結(jié)構(gòu)、Java內(nèi)存模型、Java對象模型的區(qū)別是什么

發(fā)布時(shí)間:2021-11-20 15:48:29 來源:億速云 閱讀:113 作者:柒染 欄目:軟件技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)Java常見知識(shí)點(diǎn)中Jvm內(nèi)存結(jié)構(gòu)、Java內(nèi)存模型、Java對象模型的區(qū)別是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識(shí)有一定的了解。

我們都知道,Java代碼是要運(yùn)行在虛擬機(jī)上的,而虛擬機(jī)在執(zhí)行Java程序的過程中會(huì)把所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域,這些區(qū)域都有各自的用途。其中有些區(qū)域隨著虛擬機(jī)進(jìn)程的啟動(dòng)而存在,而有些區(qū)域則依賴用戶線程的啟動(dòng)和結(jié)束而建立和銷毀。

各個(gè)區(qū)域的功能不是本文重點(diǎn),就不在這里詳細(xì)介紹了。這里簡單提幾個(gè)需要特別注意的點(diǎn):

  1. 以上是Java虛擬機(jī)規(guī)范,不同的虛擬機(jī)實(shí)現(xiàn)會(huì)各有不同,但是一般會(huì)遵守規(guī)范。

  2. 規(guī)范中定義的方法區(qū),只是一種概念上的區(qū)域,并說明了其應(yīng)該具有什么功能。但是并沒有規(guī)定這個(gè)區(qū)域到底應(yīng)該處于何處。所以,對于不同的虛擬機(jī)實(shí)現(xiàn)來說,是由一定的自由度的。

  3. 不同版本的方法區(qū)所處位置不同,上圖中劃分的是邏輯區(qū)域,并不是絕對意義上的物理區(qū)域。因?yàn)槟承┌姹镜腏DK中方法區(qū)其實(shí)是在堆中實(shí)現(xiàn)的。

  4. 運(yùn)行時(shí)常量池用于存放編譯期生成的各種字面量和符號(hào)應(yīng)用。但是,Java語言并不要求常量只有在編譯期才能產(chǎn)生。比如在運(yùn)行期,String.intern也會(huì)把新的常量放入池中。

  5. 除了以上介紹的JVM運(yùn)行時(shí)內(nèi)存外,還有一塊內(nèi)存區(qū)域可供使用,那就是直接內(nèi)存。Java虛擬機(jī)規(guī)范并沒有定義這塊內(nèi)存區(qū)域,所以他并不由JVM管理,是利用本地方法庫直接在堆外申請的內(nèi)存區(qū)域。

  6. 堆和棧的數(shù)據(jù)劃分也不是絕對的,如HotSpot的JIT會(huì)針對對象分配做相應(yīng)的優(yōu)化。

如上,做個(gè)總結(jié),JVM內(nèi)存結(jié)構(gòu),由Java虛擬機(jī)規(guī)范定義。描述的是Java程序執(zhí)行過程中,由JVM管理的不同數(shù)據(jù)區(qū)域。各個(gè)區(qū)域有其特定的功能。

二. Java內(nèi)存模型

更恰當(dāng)說JMM描述的是一組規(guī)則,通過這組規(guī)則控制程序中各個(gè)變量在共享數(shù)據(jù)區(qū)域和私有數(shù)據(jù)區(qū)域的訪問方式,JMM是圍繞原子性,有序性、可見性展開的。

Java內(nèi)存模型看上去和Java內(nèi)存結(jié)構(gòu)(JVM內(nèi)存結(jié)構(gòu))差不多,很多人會(huì)誤以為兩者是一回事兒,這也就導(dǎo)致面試過程中經(jīng)常答非所為。

在前面的關(guān)于JVM的內(nèi)存結(jié)構(gòu)的圖中,我們可以看到,其中Java堆和方法區(qū)的區(qū)域是多個(gè)線程共享的數(shù)據(jù)區(qū)域。也就是說,多個(gè)線程可能可以操作保存在堆或者方法區(qū)中的同一個(gè)數(shù)據(jù)。這也就是我們常說的“Java的線程間通過共享內(nèi)存進(jìn)行通信”。

JMM(Java Memory Model)并不像JVM內(nèi)存結(jié)構(gòu)一樣是真實(shí)存在的。他只是一個(gè)抽象的概念。JMM是和多線程相關(guān)的,他描述了一組規(guī)則或規(guī)范,這個(gè)規(guī)范定義了一個(gè)線程對共享變量的寫入時(shí)對另一個(gè)線程是可見的。

那么,簡單總結(jié)下,Java的多線程之間是通過共享內(nèi)存進(jìn)行通信的,而由于采用共享內(nèi)存進(jìn)行通信,在通信過程中會(huì)存在一系列如可見性、原子性、順序性等問題,而JMM就是圍繞著多線程通信以及與其相關(guān)的一系列特性而建立的模型。JMM定義了一些語法集,這些語法集映射到Java語言中就是volatile、synchronized等關(guān)鍵字。

在Java中,JMM是一個(gè)非常重要的概念,正是由于有了JMM,Java的并發(fā)編程才能避免很多問題。

三. Java對象模型

Java是一種面向?qū)ο蟮恼Z言,而Java對象在JVM中的存儲(chǔ)也是有一定的結(jié)構(gòu)的。而這個(gè)關(guān)于Java對象自身的存儲(chǔ)模型稱之為Java對象模型。

HotSpot虛擬機(jī)中,設(shè)計(jì)了一個(gè)OOP-Klass Model。OOP(Ordinary Object Pointer)指的是普通對象指針,而Klass用來描述對象實(shí)例的具體類型。

每一個(gè)Java類,在被JVM加載的時(shí)候,JVM會(huì)給這個(gè)類創(chuàng)建一個(gè)instanceKlass,保存在方法區(qū),用來在JVM層表示該Java類。當(dāng)我們在Java代碼中,使用new創(chuàng)建一個(gè)對象的時(shí)候,JVM會(huì)創(chuàng)建一個(gè)instanceOopDesc對象,這個(gè)對象中包含了對象頭以及實(shí)例數(shù)據(jù)。

這就是一個(gè)簡單的Java對象的OOP-Klass模型,即Java對象模型。

四. 總結(jié)

我們再來區(qū)分下JVM內(nèi)存結(jié)構(gòu)、 Java內(nèi)存模型 以及 Java對象模型 三個(gè)概念。

JVM內(nèi)存結(jié)構(gòu),和Java虛擬機(jī)的運(yùn)行時(shí)區(qū)域有關(guān)。

Java內(nèi)存模型,和Java的并發(fā)編程有關(guān)。

Java對象模型,和Java對象在虛擬機(jī)中的表現(xiàn)形式有關(guān)。

關(guān)于Java常見知識(shí)點(diǎn)中Jvm內(nèi)存結(jié)構(gòu)、Java內(nèi)存模型、Java對象模型的區(qū)別是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI