1. 程式人生 > >JVM的棧、堆和方法區

JVM的棧、堆和方法區

棧:

1、一個執行緒有一個棧區,棧與棧之間的資料不共享;

        2、用於存基礎資料型別和物件的引用;

3、棧分為3個部分:基本型別變數區、執行環境上下文、操作指令區(存放操作指令)。

★方法呼叫棧:每一個執行緒都有一個方法呼叫棧,用於跟蹤執行緒執行過程中方法的呼叫過程。棧中的每一個元素稱為一個棧幀,執行緒每執行一個方法,就向方法呼叫棧壓入一個新的棧幀。棧幀中存的是該方法的引數、區域性變數和臨時變數。

堆:

1、JVM只有一個堆區,被所有執行緒共享;

2、用於存物件(存的全部都是物件,不是基本資料型別和物件引用,是物件本身);

3、每個物件都包含一個與之對應的class的資訊。(class的目的是得到操作指令)

方法區(靜態區):

1、JVM只有一個方法區,被所有執行緒共享;

2、存著所有的class檔案資訊和static變數。

JVM工作過程:

1. 啟動JVM程序,該程序從classpath載入相應的class檔案到方法區。(先從classpath找到class檔案,讀取二進位制位元組流,存入方法區);

2. JVM定位到main方法,開始執行程式;

3. 命令執行過程中若有未載入的類,載入該類到方法區;

4. JVM為main方法中要建立的物件分配堆記憶體,並建立物件,物件的引用(對應類在方法區中的記憶體地址,指向方法區對應的類)存在當前執行緒的棧區,物件本身存在JVM堆區;

5. 繼續執行程式碼,JVM根據新建立的物件的引用,定位到堆區的例項,再根據堆區例項持有的引用定位到方法區中的類資訊,找到具體方法的位元組碼,執行。