在學習java的過程中大家會發現很多的時候有很多的知識點都是比較難學習的,但是也有一些名詞和概念看起來也是非常的相似額,所以很多的人在學習的時候就會經常分不清。今天粵嵌科技就來給大家講解下java的內存結構和模型,讓大家在學習的時候可以分的清楚這些復雜的知識點。
JVM內存結構
我們都知道,Java代碼是要運行在虛擬機上的,而虛擬機在執行Java程序的過程中會把所管理的內存劃分為若干個不同的數據區域,這些區域都有各自的用途。
其中有些區域隨著虛擬機進程的啟動而存在,而有些區域則依賴用戶線程的啟動和結束而建立和銷毀。
各個區域的功能不是本文重點,就不在這里詳細介紹了。這里簡單提幾個需要特別注意的點:
1、以上是Java虛擬機規范,不同的虛擬機實現會各有不同,但是一般會遵守規范。
2、規范中定義的方法區,只是一種概念上的區域,并說明了其應該具有什么功能。但是并沒有規定這個區域到底應該處于何處。所以,對于不同的虛擬機實現來說,是有一定的自由度的。
3、不同版本的方法區所處位置不同,上圖中劃分的是邏輯區域,并不是意義上的物理區域。因為某些版本的JDK中方法區其實是在堆中實現的。
4、運行時常量池用于存放編譯期生成的各種字面量和符號應用。但是,Java語言并不要求常量只有在編譯期才能產生。比如在運行期,String.intern也會把新的常量放入池中。
5、除了以上介紹的JVM運行時內存外,還有一塊內存區域可供使用,那就是直接內存。Java虛擬機規范并沒有定義這塊內存區域,所以他并不由JVM管理,是利用本地方法庫直接在堆外申請的內存區域。
6、堆和棧的數據劃分也不是的,如HotSpot的JIT會針對對象分配做相應的優化。
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的內存結構和模型的內容了,如果說你想要學習java 的話那么粵嵌科技歡迎大家來我們公司的java培訓班進行實地考察,也可以點擊我們文章下面的獲取試聽資格按鈕來獲取我們的java課程免費試聽資格,在試聽中可以更加深入的了解我們粵嵌科技。