您好,歡迎來到易龍商務(wù)網(wǎng)!
發(fā)布時間:2021-04-27 11:31  
【廣告】
java編程開發(fā)語言是目前大多數(shù)程序員都在學(xué)習(xí)的編程語言之一,而今天我們就一起來了解一下,java編程內(nèi)存模型與運行時數(shù)據(jù)區(qū)類型。
1、JVM內(nèi)存模型
JVM內(nèi)存模型–Java虛擬機規(guī)范定義Java內(nèi)存模型,嘗試*掉各種硬件和操作系統(tǒng)的訪問差異;–JVM內(nèi)存模型的目標(biāo):定義程序中各個變量的訪問規(guī)則,即在虛擬機中將變量存儲到內(nèi)存和從內(nèi)存取出來這樣的細節(jié);–volatile關(guān)鍵字:當(dāng)一個變量用volatile關(guān)鍵字限定后,會有兩個語義:(1)當(dāng)這個變量的值被修改后,會立即刷新到主內(nèi)存中,對其他線程可見;當(dāng)某個線程讀取這個變量的時候,也會重新將主內(nèi)存中的數(shù)據(jù)刷一份到工作內(nèi)存中來。
但是,如果多線程操作這個變量的計算中,后一個值依賴前一個值,就還是會有并發(fā)問題,說明volatile不具備原子性;(2)禁止指令重排優(yōu)化,觀察voatile變量對應(yīng)的字節(jié)碼文件,會發(fā)現(xiàn)變量的操作指令后面加了一句lockaddl$0x0,(%esp)的操作,這個操作相當(dāng)于一個內(nèi)存屏障。
–synchronized關(guān)鍵字:當(dāng)一個線程對一個變量加鎖的時候,就會清空這個變量在當(dāng)前工作內(nèi)存中的值,因此該關(guān)鍵字同時滿足了可見性和原子性。
2、Java運行時數(shù)據(jù)區(qū)
Java虛擬機運行時數(shù)據(jù)區(qū)–程序計數(shù)器(PC):Java線程私有,類似于操作系統(tǒng)里的PC計數(shù)器,用于指定下一條需要執(zhí)行的字節(jié)碼的地址;–Java虛擬機棧:Java線程私有,虛擬機展描述的是Java方法執(zhí)行的內(nèi)存模型:每個方法在執(zhí)行的時候,都會創(chuàng)建一個棧幀用于存儲局部變量、操作數(shù)、動態(tài)鏈接、方法出口等信息;每個方法調(diào)用都意味著一個棧幀在虛擬機棧中入棧到出棧的過程;
–本地方法棧:和Java虛擬機棧的作用類似,區(qū)別是該該區(qū)域為JVM調(diào)用到的本地方法服務(wù);–堆(Heap):所有線程共享的一塊區(qū)域,垃圾收集器管理的主要區(qū)域。
目前主要的垃圾回收算法都是分代收集,因此該區(qū)域還可以細分為如下區(qū)域:–年輕代–Eden空間–FromSurvivor空間1,F(xiàn)romSurvivor空間2,用于存儲在Younggc過程中幸存的對象;
–老年代–方法區(qū):各個線程共享的一個區(qū)域,用于存儲虛擬機加載的類信息、常量、靜態(tài)變量等信息;–運行時常量池:方法區(qū)的一部分,用于存放編譯器生成的各種字面量和符號引用;