基本概念堆區:
1.儲存的全部是物件,每個物件都包含乙個與之對應的
class
的資訊。
(class
的目的是得到操作指令)。
2.jvm
只有乙個堆區
(heap)
被所有執行緒共享,堆中不存放基本型別和物件引用,只存放物件本身。棧區:
1.每個執行緒包含乙個棧區,棧中只儲存基礎資料型別的物件和自定義物件的引用
(不是物件
),物件都存放在堆區中。
2.每個棧中的資料
(原始型別和物件引用
)都是私有的,其他棧不能訪問。
3.棧分為
3個部分:基本型別變數區、執行環境上下文、操作指令區
(存放操作指令)。
方法區:
1.又叫靜態區,跟堆一樣,被所有的執行緒共享。方法區包含所有的
class
和static
變數。2.
方法區中包含的都是在整個程式中永遠唯一的元素,如
class
,static
變數。
說明:這裡物件與記憶體位址是相對關係,物件引用指的是物件在記憶體中的位址。
資料型別分為基本資料型別和引用資料型別,如圖
具體案例如下:
public class test1
}
執行結果為:11
test.a@6e1408
這個案例分為三種情況:
第一種為 int t=1;
這條語句應該分解為兩個步驟:
int t;//我們結合上述概念,這句是告訴jvm在執行期間該執行緒中的私有棧中為變數t分配乙個存放記憶體位址的空間。
t=1;//這一步,jvm判斷1為基本資料型別,則在該私有棧中查字面值為1的位址,如果沒有則建立該位址,並且該位址為私有棧內部變數共享,就是其他內部變數值也為1的話,就不需要再在該私有棧中建立1的位址,返回給變數t的就是私有棧內的位址。輸出結果為1是根據jvm內部規則執行的,這裡注意一點1這個位址在私有棧內是唯一。
第二種為 public static final int s=1;
這條語句就乙個步驟:
public static final int s=1;//這句是告訴jvm在編譯期間就在該執行緒中的私有棧中為變數t分配乙個存放記憶體位址的固定空間,並由於是static及int修飾的,並已經賦值,則在該私有棧中直接為1分配乙個固定空間,位址反饋給t,相當於t這個變數及1這個基本資料型別均固定不能更改任何特性,直到該執行緒結束,也就是在編譯期均已經確定,執行期對其無法更改。
這裡public static final int s;//這句就與上面的不一樣,分為編譯期與執行期,編譯期就是在該執行緒中的私有棧中為變數t分配乙個存放記憶體位址的固定空間,由於是static及int修飾的,則被指定賦值為0,直到執行期初始化時,可以通過被賦值來改變指向的物件,也就是說變數t一直無法改變其空間位置,而其內的物件位址可以更改。
第三種 為 a a1 = new a();
我們也分為兩步:
a a1;//jvm在該執行緒中的私有棧中為變數t分配乙個存放記憶體位址的空間,該空間的值是無法確定的,需要被初始化才能知道。
a1 = new a();//jvm先判斷資料型別,是引用資料型別,則在方法區中查詢 a()的class原碼,如果沒有則返回錯誤,但一般都是已經載入進記憶體的了,正常情況下均會找到,找到了後,在堆中根據class大小分配記憶體空間(堆是動態分配記憶體空間的),然後拷貝乙份a()的class到該空間中,這裡可以明白如果a()的class內的某個變數被賦值,方法區內的該變數還是保持原來的狀態,改變的只是堆中的class拷貝,也就是例項化後的物件。然後返回堆中的記憶體位址給私有棧。這裡的輸出結果不是1而是test.a@6e1408這個記憶體位址,這可能是jvm內部的執行機制,以後再細細研究。這裡可以看出堆中的物件是無法共享的,因為即使是同乙個class的拷貝,執行中其成員變數可以被賦予不同的值,這就無法共享了。
****:[email protected]
深入分析Java中CAS機制
在jdk 1.5中增加的乙個最主要的支援是atomic類,比如說atomicinteger,atomiclong,這些類可幫助最大限度地減少在多執行緒中對於一些基本操作 例如,增加或減少多個執行緒之間共享的值 的複雜性。而這些類的實現都依賴於cas compare and swap 的演算法。但是,...
深入分析java執行緒中的volatile
平時在閱讀jdk原始碼的時候,經常看到原始碼中有寫變數被volatile關鍵字修飾,但是卻不是十分清除這個關鍵字到底有什麼用處,現在終於弄清楚了,那麼我就來講講這個volatile到底有什麼用吧。當乙個變數被定義為volatile之後,就可以保證此變數對所有執行緒的可見性,即當乙個執行緒修改了此變數...
Java中堆 棧 方法區分析
堆 堆用於儲存建立好的物件和陣列 陣列也是物件 jvm只有乙個堆,被所有執行緒共享 對是乙個不連續的記憶體空間,分配靈活,速度慢 棧 棧描述的是方法執行的記憶體模型。每個方法被呼叫都會建立乙個棧幀 儲存區域性變數 運算元 方法出口等 jvm為每個執行緒建立乙個棧,用於存放改執行緒執行方法的資訊 實際...