JVM內(nèi)存結(jié)構(gòu)、Java內(nèi)存模型和Java對象模型的區(qū)別

JVM內(nèi)存結(jié)構(gòu)、Java內(nèi)存模型和Java對象模型是截然不同的三種概念。

1. JVM內(nèi)存結(jié)構(gòu)

Java程序執(zhí)行過程中,內(nèi)存會(huì)被劃分為不同的數(shù)據(jù)區(qū)域,各個(gè)區(qū)域有各自的用途。

  1. 有些區(qū)域隨虛擬機(jī)的啟動(dòng)而存在
  2. 有些區(qū)域隨線程的啟動(dòng)而啟動(dòng),隨線程的結(jié)束而銷毀
JVM內(nèi)存結(jié)構(gòu)

需要注意的點(diǎn)

  1. Java虛擬機(jī)規(guī)范,不同的虛擬機(jī)實(shí)現(xiàn)可能不同,但是一般都會(huì)遵守規(guī)范
  2. 規(guī)范中方法區(qū)只是一種概念上的區(qū)域,說明了其應(yīng)該具有的功能,但并沒有說明其具體應(yīng)該位于何處。不同的虛擬機(jī)實(shí)現(xiàn),會(huì)有一定的自由度。有些虛擬機(jī)是在堆內(nèi)實(shí)現(xiàn)的
  3. 運(yùn)行時(shí)常量池用于存放編譯期的各種字面值和符號引用。不過Java并沒有要求常量只能在編譯期才能產(chǎn)生,通過String.intern也能產(chǎn)生
  4. 除了圖中所列的內(nèi)存區(qū)域,還有一塊內(nèi)存可供使用,那就是直接內(nèi)存。JVM規(guī)范并沒有定義這一塊區(qū)域,所以并不由JVM管理,是利用本地方法庫直接在堆外申請的內(nèi)存
  5. 堆和棧的數(shù)據(jù)劃分并不是絕對的,JIT會(huì)針對對象分配做一定的優(yōu)化

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

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

Java堆和方法區(qū)是多個(gè)線程共享的數(shù)據(jù)區(qū)域。多個(gè)線程可以操作堆和方法區(qū)中的同一個(gè)數(shù)據(jù)。Java的線程間通過共享內(nèi)存進(jìn)行通信

Java內(nèi)存模型

Java內(nèi)存模型的英文名稱為Java Memory Model(JMM),其并不想JVM內(nèi)存結(jié)構(gòu)一樣真實(shí)存在,而是一個(gè)抽象的概念。通過JSR-133 Java Memory Model and Thread Specification中的描述,我們知道JMM和線程有關(guān),它描述了一組規(guī)范或規(guī)則,一個(gè)線程對共享變量的寫入時(shí)對另一個(gè)線程是可見的。
Java多線程對共享內(nèi)存進(jìn)行操作的時(shí)候,會(huì)存在一些如可見性、原子性和順序性的問題,JMM是圍繞著多線程通信及相關(guān)的一些特性而建立的模型。而JMM定義了一些語法集,而這些語法集映射到Java語言的volatile、synchronized等關(guān)鍵字

3. Java對象模型

Java對象在JVM中的存儲(chǔ)有一定的結(jié)構(gòu),Java對象自身的存儲(chǔ)模型就叫做Java對象模型。

Java對象模型

總結(jié)

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)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容