- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > web開(kāi)發(fā) >
- Java內存模型(JMM)和虛擬機(JVM)內存、GC
概念:棧描述的是Java方法執行的內存模型,每個(gè)方法在被執行的時(shí)候都會(huì )創(chuàng )建一個(gè)自己的內存棧用于存放局部的變量等相關(guān)信息,存放的方式是逐個(gè)存放,所以這里有個(gè)棧先進(jìn)后出的過(guò)程。
?
?
1.程序計數器
3.堆
?
volatile 用于保證可見(jiàn)性
Java內存模型(JMM)
在面試過(guò)程中,關(guān)于Java的內存模型(側重于:Java的并發(fā)原理)和JVM的內存模型并不是同一個(gè)問(wèn)題,所以自己在通過(guò)查詢(xún)資料之后對相關(guān)的知識點(diǎn)進(jìn)行總結,如果有寫(xiě)得錯誤的地方,歡迎指出,也可以一起探討。
再具體的關(guān)于CPU和內存之間的愛(ài)恨糾纏目前我就沒(méi)有在深入,感興趣的同學(xué)可以自己去了解一下
?
?
?
?
目的:用于存儲已被虛擬機加載的類(lèi)信息、常量、靜態(tài)變量
注意:為什么會(huì )有棧和堆之分:
概念: 方法區和堆的概念比較類(lèi)似,就是所有線(xiàn)程共享的內存,為了和堆進(jìn)行區分,又被稱(chēng)為了“非堆”
概念:堆是Java虛擬機中內存最大的一個(gè)塊內存區域,因為堆存放的對象是線(xiàn)程共享的,所以多線(xiàn)程的時(shí)候也需要同步機制。所有的對象實(shí)例及數組大多數都是在堆上分配內存,之所以不是都是這樣,原因在于JIT編譯器技術(shù)的成熟,這個(gè)說(shuō)法不是這么絕對了。
4.方法區
JVM內存模型
GC這邊我就不做詳細的介紹了,畢竟自己也在學(xué)習過(guò)程中,GC是可以拿出來(lái)講好久的內容,目前我還沒(méi)有進(jìn)行總結。
基于計算機的內存設計結構,CPU在發(fā)展過(guò)程中,運行速度越來(lái)越快,內存的讀寫(xiě)速度跟不上CPU的運行速度,因此提出來(lái)“緩存” 的概念。CPU在讀寫(xiě)過(guò)程中,可以將數據先寫(xiě)入緩存中,然后緩存將數據刷新到主存中。因此,在多線(xiàn)程的場(chǎng)景下就會(huì )出現“緩存不一致的情況”,就是多個(gè)線(xiàn)程對同一個(gè)數據的緩存可能不一致。
·· Java內存模型就是一種符合內存模型規范的,屏蔽了各種硬件和操作系統的訪(fǎng)問(wèn)差異,保證了Java程序在各種平臺下對內存的訪(fǎng)問(wèn)都能保證其效果一致的機制和規范
2.Java棧(虛擬機棧)
?
目的:CPU在執行多線(xiàn)程任務(wù)時(shí),為了確保線(xiàn)程能夠正常切換到正確的執行位置,每個(gè)線(xiàn)程都有一個(gè)獨立的程序計數器,不同線(xiàn)程之間的程序計數器互不影響,獨立存儲。
?
Java中提供了一系列和并發(fā)相關(guān)的關(guān)鍵字,比如:volatile、synchronized、final、concurren
概念:程序計數器是一塊很小的內存空間,它是線(xiàn)程私有的,可以認作為當前線(xiàn)程的行號指示器。
原子性:一個(gè)操作中CPU不能暫停、中斷,要么執行完成,要么不執行
當方法執行完成之后,內存棧被銷(xiāo)毀,所以方法中定義的變量都是放置在內存棧中。
5.本地方法棧
當一個(gè)方法執行時(shí),每個(gè)方法都是建立自己的內存棧用于存放方法中定義的變量,在方法結束后進(jìn)行銷(xiāo)毀,但是在程序中創(chuàng )建一個(gè)對象時(shí),這個(gè)對象將被保存在堆中(也可以稱(chēng)為:運行時(shí)數據區,堆是其中的一部分),方便可以反復的使用,這是因為創(chuàng )建對象的成本通常會(huì )比較的大。既讓這樣,那么在堆內存的中的對象就不會(huì )隨著(zhù)方法的結束而銷(xiāo)毀,當這個(gè)對象被一個(gè)方法引用完了之后還可能被其他的引用變量使用,則這個(gè)對象就不會(huì )被銷(xiāo)毀。只有在一個(gè)對象沒(méi)有任何的引用變量引用他時(shí),系統的垃圾回收機制才會(huì )在合適的時(shí)候回收他(是不是聽(tīng)起來(lái)很熟悉,特別的像GC)
synchronized 用于保證 原子性
首先提一下三個(gè)概念,基本上內存模型就是為了解決這三個(gè)問(wèn)題
Java內存模型如何實(shí)現
?
?
其實(shí)這些就是Java內存模型封裝在底層中實(shí)現后提供給程序員使用的關(guān)鍵字
本文的重點(diǎn)在于了解JMM,所以不會(huì )對相關(guān)的關(guān)鍵字進(jìn)行詳細的介紹?。。?!
注意:如果線(xiàn)程執行的是個(gè)java方法,那么計數器記錄虛擬機字節碼指令的地址。如果為native【底層方法】,那么計數器為空。這塊內存區域是虛擬機規范中唯一沒(méi)有OutOfMemoryError的區域
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系站長(cháng)郵箱:ts@56dr.com進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2 建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站