內存模型以及分區

Java內存模型(即Java Memory Model,簡稱JMM)本身是一種抽象的概念。java內存模型中分爲主內存和工作內存。主內存裏面存儲着所有變量,主內存是共享內存區域,所有線程都可以訪問。每一個線程都私有一個工作內存,工作內存裏面保存着主內存裏面變量值的副本,線程對變量的操作都是在工作內存中完成,操作結束後再放回主內存。主內存可粗略認爲是堆,工作內存認爲是棧。操作系統中,一般CPU都會從內存取數據到寄存器,然後進行處理,但由於內存的處理速度遠遠低於CPU,導致CPU在處理指令時往往花費很多時間在等待內存做準備工作,於是在寄存器和主內存間添加了CPU緩存,CPU緩存比較小,但訪問速度比主內存快得多。Java虛擬機在程序執行過程會把jvm的內存分爲若干個不同的數據區域來管理,這些區域有自己的用途,以及創建和銷燬時間。

jvm管理的內存區域包括以下幾個區域:

棧區:

棧分爲java虛擬機棧和本地方法棧

1)  重點是Java虛擬機棧,它是線程私有的,生命週期與線程相同。

2)  每個方法執行都會創建一個棧幀,用於存放局部變量表,操作棧,動態鏈接,方法出口等。每個方法從被調用,直到被執行完。對應着一個棧幀在虛擬機中從入棧到出棧的過程。

3)  通常說的棧就是指局部變量表部分,存放編譯期間可知的8種基本數據類型,及對象引用和指令地址。局部變量表是在編譯期間完成分配,當進入一個方法時,這個棧中的局部變量分配內存大小是確定的。

4)  會有兩種異常StackOverFlowError和 OutOfMemoneyError。當線程請求棧深度大於虛擬機所允許的深度就會拋出StackOverFlowError錯誤;虛擬機棧動態擴展,當擴展無法申請到足夠的內存空間時候,拋出OutOfMemoneyError。

5)  本地方法棧 爲虛擬機使用到本地方法服務(native)

堆區:

1)  堆被所有線程共享區域,在虛擬機啓動時創建,唯一目的存放對象實例。

2)  堆區是gc的主要區域,通常情況下分爲兩個區塊年輕代和年老代。更細一點年輕代又分爲Eden區,放新創建對象,From survivor 和 T

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章