Java虛擬機規範中試圖定義一種Java內存模型來屏蔽掉各類硬件和操做系統的內存訪問差別,以實現讓Java程序在各類平臺下都能達到一致的訪問效果。java
Java內存模型的主要目標是定義程序中各個變量的訪問規則,即在虛擬機中將變量存儲到內存和從內存中取出變量這樣的底層細節。操作系統
一、java內存模型:java代碼是運行在java虛擬機之上的,由java虛擬機經過解釋執行(解釋器)或編譯執行(即時編譯器)來完成。故java內存模型也就是指java虛擬機的運行時模型。線程
從圖中可知,內存分爲兩類:共享數據區和線程私有。
(1)線程私有區
a、程序計數器:一塊較小的內存空間,能夠看作是當前線程所執行的字節碼的行號指示器。記錄正在執行的虛擬機字節碼的地址,每一個線程都須要一個獨立的程序計數器。
若是線程正在執行的是一個java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;若是正在執行的是native方法,這個計數器值則爲空。
b、虛擬機棧:方法執行的內存區,每一個方法執行時會在虛擬機棧中建立棧幀用於存儲變量表、操做數棧、動態連接、方法進出口等信息。
c、本地方法棧:虛擬機的native方法執行的內存區。
(2)共享數據區
a、堆:java堆是java虛擬機所管理的內存中最大的一塊。java堆是被全部線程共享的一塊區域,在虛擬機啓動時建立。此區域的惟一目的就是存放對象實例。
java堆是垃圾收集器管理的主要區域,不少時候也稱爲GC堆。
java堆能夠處於物理上不連續的內存空間,之要邏輯上是連續的便可。大小可固定也可擴展。
b、方法區:用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。
——常量池:方法區的一部分,存放編譯期生成的各類字面量和符號引用。
參考書籍 《深刻理解Java虛擬機》 機械工業出版社 周志明著