JVM 變數儲存位置

2022-08-02 05:51:10 字數 2258 閱讀 7528

1.暫存器:最快的儲存區, 由編譯器根據需求進行分配,我們在程式中無法控制.

2. 棧:方法執行時建立方法棧幀,存放基本型別的變數資料和物件的引用,但物件本身不存放在棧中,而是存放在堆(new 出來的物件)或者常量池中(字串常量物件存放在常量池中。)

3. 堆:存放所有new出來的物件。

4. 靜態域(方法區):存放靜態成員(static定義的)

5. 常量池(方法區):存放字串常量和基本型別常量(public static final)。

6. 非ram儲存:硬碟等永久儲存空間

這裡我們主要關心棧,堆和常量池,對於棧和常量池中的物件可以共享,對於堆中的物件不可以共享。棧中的資料大小和生命週期是可以確定的,當沒有引用指向資料時,這個資料就會消失。堆中的物件的由垃圾**器負責**,因此大小和生命週期不需要確定,具有很大的靈活性。

對於字串:其物件的引用都是儲存在棧中的,如果是編譯期已經建立好(直接用雙引號定義的)的就儲存在常量池中,如果是執行期(new出來的)才能確定的就儲存在堆中。對於equals相等的字串,在常量池中永遠只有乙份,在堆中有多份。

如以下**:

string s1 = "china";  

string s2 = "china";

string s3 = "china";

string ss1 = new string("china");

string ss2 = new string("china");

string ss3 = new string("china");

這裡解釋一下黃色這3個箭頭,對於通過new產生乙個字串(假設為」china」)時,會先去常量池中查詢是否已經有了」china」物件,如果沒有則在常量池中建立乙個此字串物件,然後堆中再建立乙個常量池中此」china」物件的拷貝物件。這也就是有道面試題:string s = new string(「xyz」);產生幾個物件?乙個或兩個,如果常量池中原來沒有」xyz」,就是兩個。

對於基礎型別的變數和常量:變數和引用儲存在棧中,常量儲存在常量池中。

如以下**:

對於成員變數和區域性變數:成員變數就是方法外部,類的內部定義的變數;區域性變數就是方法或語句塊內部定義的變數。區域性變數必須初始化。

形式引數是區域性變數,區域性變數的資料存在於棧記憶體中。棧記憶體中的區域性變數隨著方法的消失而消失。

成員變數儲存在堆中的物件裡面,由垃圾**器負責**。

如以下**:

class birthdate   

省略get,set方法………

}

public class test

public void change1(int i)

}

對於以上這段**,date為區域性變數,i,d,m,y都是形參為區域性變數,day,month,year為成員變數。下面分析一下**執行時候的變化:

1. main方法開始執行:int date = 9;

date區域性變數,基礎型別,引用和值都存在棧中。

2. test test = new test();

test為物件引用,存在棧中,物件(new test())存在堆中。

3. test.change(date);

i為區域性變數,引用和值存在棧中。當方法change執行完成後,i就會從棧中消失。

4. birthdate d1= new birthdate(7,7,1970);  

d1為物件引用,存在棧中,物件(new birthdate())存在堆中,其中d,m,y為區域性變數儲存在棧中,且它們的型別為基礎型別,因此它們的資料也儲存在棧中。day,month,year為成員變數,它們儲存在堆中(new birthdate()裡面)。當birthdate構造方法執行完之後,d,m,y將從棧中消失。

5.main方法執行完之後,date變數,test,d1引用將從棧中消失,new test(),new birthdate()將等待垃圾**。

變數儲存位置

1 首先,講下 堆 heap 和 棧 stack 的區別 乙個由 c c 編譯過的程式占用的記憶體分為一下幾個部分 1 棧區 stack 由編譯器自動分配釋放,存放區域性變數 2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配...

constant變數儲存位置 Ruby 變數

變數是持有可被任何程式使用的任何資料的儲存位置。ruby 支援五種型別的變數。您已經在前面的章節中大概了解了這些變數,本章節將為您詳細講解這五種型別的變數。全域性變數以 開頭。未初始化的全域性變數的值為 nil,在使用 w 選項後,會產生警告。給全域性變數賦值會改變全域性狀態,所以不建議使用全域性變...

c c 變數的儲存位置

變數的記憶體一般分為5部分 棧區stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數等,對棧的操作方式類似於資料結構中的棧 堆區heap 一般由程式設計師分配釋放,如果程式設計師不釋放,程式結束時可能由os揮手,但是它與資料結構中的堆是兩回事,分配方式類似於鍊錶。全域性區 靜態區 sati...