偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

JVM內(nèi)存結(jié)構(gòu) VS Java內(nèi)存模型 VS Java對象模型

開發(fā) 開發(fā)工具
Java作為一種面向?qū)ο蟮?,跨平臺語言,其對象、內(nèi)存等一直是比較難的知識點。而且很多概念的名稱看起來又那么相似,很多人會傻傻分不清楚。比如本文我們要討論的JVM內(nèi)存結(jié)構(gòu)、Java內(nèi)存模型和Java對象模型,這就是三個截然不同的概念,但是很多人容易弄混。

Java作為一種面向?qū)ο蟮?,跨平臺語言,其對象、內(nèi)存等一直是比較難的知識點。而且很多概念的名稱看起來又那么相似,很多人會傻傻分不清楚。比如本文我們要討論的JVM內(nèi)存結(jié)構(gòu)、Java內(nèi)存模型和Java對象模型,這就是三個截然不同的概念,但是很多人容易弄混。

可以這樣說,很多高級開發(fā)甚至都搞不不清楚JVM內(nèi)存結(jié)構(gòu)、Java內(nèi)存模型和Java對象模型這三者的概念及其間的區(qū)別。甚至我見過有些面試官自己也搞的不是太清楚。不信的話,你去網(wǎng)上搜索Java內(nèi)存模型,還會有很多文章的內(nèi)容其實介紹的是JVM內(nèi)存結(jié)構(gòu)。

首先,這三個概念是完全不同的三個概念。本文主要對這三個概念加以區(qū)分以及簡單介紹。其中每一個知識點都可以單獨寫一篇文章,本文并不會深入介紹,感興趣的朋友可以加入我的知識星球和球友們共同學(xué)習(xí)。

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

我們都知道,Java代碼是要運行在虛擬機上的,而虛擬機在執(zhí)行Java程序的過程中會把所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域,這些區(qū)域都有各自的用途。

其中有些區(qū)域隨著虛擬機進程的啟動而存在,而有些區(qū)域則依賴用戶線程的啟動和結(jié)束而建立和銷毀。在《Java虛擬機規(guī)范(Java SE 8)》中描述了JVM運行時內(nèi)存區(qū)域結(jié)構(gòu)如下:

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

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

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

3、不同版本的方法區(qū)所處位置不同,上圖中劃分的是邏輯區(qū)域,并不是絕對意義上的物理區(qū)域。因為某些版本的JDK中方法區(qū)其實是在堆中實現(xiàn)的。

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

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

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

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

Java內(nèi)存模型

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

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

Java內(nèi)存模型是根據(jù)英文Java Memory Model(JMM)翻譯過來的。其實JMM并不像JVM內(nèi)存結(jié)構(gòu)一樣是真實存在的。他只是一個抽象的概念。JSR-133: Java Memory Model and Thread Specification 中描述了,JMM是和多線程相關(guān)的,他描述了一組規(guī)則或規(guī)范,這個規(guī)范定義了一個線程對共享變量的寫入時對另一個線程是可見的。

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

在JMM中,我們把多個線程間通信的共享內(nèi)存稱之為主內(nèi)存,而在并發(fā)編程中多個線程都維護了一個自己的本地內(nèi)存(這是個抽象概念),其中保存的數(shù)據(jù)是主內(nèi)存中的數(shù)據(jù)拷貝。而JMM主要是控制本地內(nèi)存和主內(nèi)存之間的數(shù)據(jù)交互的。

在Java中,JMM是一個非常重要的概念,正是由于有了JMM,Java的并發(fā)編程才能避免很多問題。這里就不對Java內(nèi)存模型做更加詳細的介紹了,想了解更多的朋友可以參考《Java并發(fā)編程的藝術(shù)》。

Java對象模型

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

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

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

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

總結(jié)

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

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

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

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

關(guān)于這三部分內(nèi)容,本文并未分別展開,因為涉及到的知識點實在太多,如果讀者感興趣,可以自行學(xué)習(xí)。后面也會發(fā)文介紹這些內(nèi)容,敬請期待。

***,這三個概念非常重要,一定要嚴格區(qū)分開,千萬不要在面試中出現(xiàn)答非所為的情況。

【本文是51CTO專欄作者Hollis的原創(chuàng)文章,作者微信公眾號Hollis(ID:hollischuang)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2010-09-25 12:38:40

JVM內(nèi)存模型

2025-03-04 10:45:19

JVM內(nèi)存模型Java

2009-06-24 16:50:11

Java內(nèi)存模型

2023-11-05 12:05:35

JVM內(nèi)存

2023-07-11 08:43:43

volatileJava內(nèi)存

2023-06-07 08:08:43

JVM內(nèi)存模型

2019-11-08 15:11:03

Java架構(gòu)數(shù)據(jù)

2018-11-01 10:34:37

JVM內(nèi)存配置

2010-02-22 08:58:35

JVM內(nèi)存模型垃圾收集

2024-07-26 10:23:52

2017-09-20 08:48:09

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

2010-09-27 13:48:41

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

2018-12-18 14:08:01

Java內(nèi)存volatile

2013-07-11 10:37:20

Java內(nèi)存模型

2022-07-07 08:00:51

Java內(nèi)存模型

2020-12-07 06:23:48

Java內(nèi)存

2022-02-04 22:05:19

JVM程序內(nèi)存模型

2023-11-27 12:24:23

算法模型業(yè)務(wù)模型

2010-01-18 17:48:46

C++類對象

2025-06-06 06:25:07

點贊
收藏

51CTO技術(shù)棧公眾號