成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JVM內存結構 VS Java內存模型 VS Java對象模型

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

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

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

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

JVM內存結構

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

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

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

1、以上是Java虛擬機規范,不同的虛擬機實現會各有不同,但是一般會遵守規范。

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

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

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

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

6、堆和棧的數據劃分也不是絕對的,如HotSpot的JIT會針對對象分配做相應的優化。

如上,做個總結,JVM內存結構,由Java虛擬機規范定義。描述的是Java程序執行過程中,由JVM管理的不同數據區域。各個區域有其特定的功能。

Java內存模型

Java內存模型看上去和Java內存結構(JVM內存結構)差不多,很多人會誤以為兩者是一回事兒,這也就導致面試過程中經常答非所為。

在前面的關于JVM的內存結構的圖中,我們可以看到,其中Java堆和方法區的區域是多個線程共享的數據區域。也就是說,多個線程可能可以操作保存在堆或者方法區中的同一個數據。這也就是我們常說的“Java的線程間通過共享內存進行通信”。

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

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

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

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

Java對象模型

Java是一種面向對象的語言,而Java對象在JVM中的存儲也是有一定的結構的。而這個關于Java對象自身的存儲模型稱之為Java對象模型。

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

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

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

總結

我們再來區分下JVM內存結構、 Java內存模型 以及 Java對象模型 三個概念。

JVM內存結構,和Java虛擬機的運行時區域有關。

Java內存模型,和Java的并發編程有關。

Java對象模型,和Java對象在虛擬機中的表現形式有關。

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

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

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

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

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2010-09-25 12:38:40

JVM內存模型

2025-03-04 10:45:19

JVM內存模型Java

2009-06-24 16:50:11

Java內存模型

2023-11-05 12:05:35

JVM內存

2023-07-11 08:43:43

volatileJava內存

2023-06-07 08:08:43

JVM內存模型

2019-11-08 15:11:03

Java架構數據

2018-11-01 10:34:37

JVM內存配置

2010-02-22 08:58:35

JVM內存模型垃圾收集

2024-07-26 10:23:52

2017-09-20 08:48:09

JVM內存結構

2010-09-27 13:48:41

JVM內存結構

2018-12-18 14:08:01

Java內存volatile

2013-07-11 10:37:20

Java內存模型

2022-07-07 08:00:51

Java內存模型

2020-12-07 06:23:48

Java內存

2022-02-04 22:05:19

JVM程序內存模型

2023-11-27 12:24:23

算法模型業務模型

2010-01-18 17:48:46

C++類對象

2025-06-06 06:25:07

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一区在线视频 | 久久久久久国产精品 | 国产欧美一区二区三区在线看 | m豆传媒在线链接观看 | 三级成人片 | 性做久久久久久免费观看欧美 | 欧美日韩在线观看一区 | 欧美激情一区二区 | 亚洲欧美综合 | 亚洲成人午夜电影 | 国产精品三级 | 国产精品久久久久久久久久三级 | 国产视频福利一区 | 亚洲不卡在线观看 | 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 欧美综合一区 | 欧美视频一区二区三区 | 亚洲欧美中文日韩在线v日本 | 国产精品久久久久一区二区三区 | 综合色久| 成人在线视频一区 | 久久99这里只有精品 | 国产精品久久精品 | 久久蜜桃av一区二区天堂 | 成人国产精品久久 | 欧美日韩一区二区三区视频 | 日韩一区二区黄色片 | 欧美一区二区三区四区视频 | 婷婷开心激情综合五月天 | 免费一区二区三区 | 99re视频在线| 亚洲www啪成人一区二区麻豆 | 国产精品久久久久久高潮 | 精品久久久久久久久久久下田 | 色888www视频在线观看 | 亚洲国产精品va在线看黑人 | 欧美1区| av在线一区二区 | 欧美一区二区三区视频 | 午夜免费影视 | 81精品国产乱码久久久久久 |