在學(xué)習(xí)java的過(guò)程中大家會(huì)發(fā)現(xiàn)很多的時(shí)候有很多的知識(shí)點(diǎn)都是比較難學(xué)習(xí)的,但是也有一些名詞和概念看起來(lái)也是非常的相似額,所以很多的人在學(xué)習(xí)的時(shí)候就會(huì)經(jīng)常分不清。今天達(dá)內(nèi)科技就來(lái)給大家講解下java的內(nèi)存結(jié)構(gòu)和模型,讓大家在學(xué)習(xí)的時(shí)候可以分的清楚這些復(fù)雜的知識(shí)點(diǎn)。
JVM內(nèi)存結(jié)構(gòu)
我們都知道,Java代碼是要運(yùn)行在虛擬機(jī)上的,而虛擬機(jī)在執(zhí)行Java程序的過(guò)程中會(huì)把所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域,這些區(qū)域都有各自的用途。
其中有些區(qū)域隨著虛擬機(jī)進(jìn)程的啟動(dòng)而存在,而有些區(qū)域則依賴用戶線程的啟動(dòng)和結(jié)束而建立和銷毀。
各個(gè)區(qū)域的功能不是本文重點(diǎn),就不在這里詳細(xì)介紹了。這里簡(jiǎn)單提幾個(gè)需要特別注意的點(diǎn):
1、以上是Java虛擬機(jī)規(guī)范,不同的虛擬機(jī)實(shí)現(xiàn)會(huì)各有不同,但是一般會(huì)遵守規(guī)范。
2、規(guī)范中定義的方法區(qū),只是一種概念上的區(qū)域,并說(shuō)明了其應(yīng)該具有什么功能。但是并沒(méi)有規(guī)定這個(gè)區(qū)域到底應(yīng)該處于何處。所以,對(duì)于不同的虛擬機(jī)實(shí)現(xiàn)來(lái)說(shuō),是有一定的自由度的。
3、不同版本的方法區(qū)所處位置不同,上圖中劃分的是邏輯區(qū)域,并不是意義上的物理區(qū)域。因?yàn)槟承┌姹镜腏DK中方法區(qū)其實(shí)是在堆中實(shí)現(xiàn)的。
4、運(yùn)行時(shí)常量池用于存放編譯期生成的各種字面量和符號(hào)應(yīng)用。但是,Java語(yǔ)言并不要求常量只有在編譯期才能產(chǎn)生。比如在運(yùn)行期,String.intern也會(huì)把新的常量放入池中。
5、除了以上介紹的JVM運(yùn)行時(shí)內(nèi)存外,還有一塊內(nèi)存區(qū)域可供使用,那就是直接內(nèi)存。Java虛擬機(jī)規(guī)范并沒(méi)有定義這塊內(nèi)存區(qū)域,所以他并不由JVM管理,是利用本地方法庫(kù)直接在堆外申請(qǐng)的內(nèi)存區(qū)域。
6、堆和棧的數(shù)據(jù)劃分也不是的,如HotSpot的JIT會(huì)針對(duì)對(duì)象分配做相應(yīng)的優(yōu)化。
Java內(nèi)存模型
Java內(nèi)存模型看上去和Java內(nèi)存結(jié)構(gòu)(JVM內(nèi)存結(jié)構(gòu))差不多,很多人會(huì)誤以為兩者是一回事兒,這也就導(dǎo)致面試過(guò)程中經(jīng)常答非所為。
在前面的關(guān)于JVM的內(nèi)存結(jié)構(gòu)的圖中,我們可以看到,其中Java堆和方法區(qū)的區(qū)域是多個(gè)線程共享的數(shù)據(jù)區(qū)域。也就是說(shuō),多個(gè)線程可能可以操作保存在堆或者方法區(qū)中的同一個(gè)數(shù)據(jù)。這也就是我們常說(shuō)的“Java的線程間通過(guò)共享內(nèi)存進(jìn)行通信”。
Java內(nèi)存模型是根據(jù)英文Java Memory
Model(JMM)翻譯過(guò)來(lái)的。其實(shí)JMM并不像JVM內(nèi)存結(jié)構(gòu)一樣是真實(shí)存在的。他只是一個(gè)抽象的概念。JSR-133: Java Memory Model
and Thread Specification
中描述了,JMM是和多線程相關(guān)的,他描述了一組規(guī)則或規(guī)范,這個(gè)規(guī)范定義了一個(gè)線程對(duì)共享變量的寫(xiě)入時(shí)對(duì)另一個(gè)線程是可見(jiàn)的。
那么,簡(jiǎn)單總結(jié)下,Java的多線程之間是通過(guò)共享內(nèi)存進(jìn)行通信的,而由于采用共享內(nèi)存進(jìn)行通信,在通信過(guò)程中會(huì)存在一系列如可見(jiàn)性、原子性、順序性等問(wèn)題,而JMM就是圍繞著多線程通信以及與其相關(guān)的一系列特性而建立的模型。JMM定義了一些語(yǔ)法集,這些語(yǔ)法集映射到Java語(yǔ)言中就是volatile、synchronized等關(guān)鍵字。
在JMM中,我們把多個(gè)線程間通信的共享內(nèi)存稱之為主內(nèi)存,而在并發(fā)編程中多個(gè)線程都維護(hù)了一個(gè)自己的本地內(nèi)存(這是個(gè)抽象概念),其中保存的數(shù)據(jù)是主內(nèi)存中的數(shù)據(jù)拷貝。而JMM主要是控制本地內(nèi)存和主內(nèi)存之間的數(shù)據(jù)交互的。
以上就是達(dá)內(nèi)科技的小編給大家整理的關(guān)于java的內(nèi)存結(jié)構(gòu)和模型的內(nèi)容了,如果說(shuō)你想要學(xué)習(xí)java
的話那么達(dá)內(nèi)科技?xì)g迎大家來(lái)我們公司的java培訓(xùn)班進(jìn)行實(shí)地考察,也可以點(diǎn)擊我們文章下面的獲取試聽(tīng)資格按鈕來(lái)獲取我們的java課程免費(fèi)試聽(tīng)資格,在試聽(tīng)中可以更加深入的了解我們達(dá)內(nèi)科技。