基本型別的變數如果是臨時變數,只要定義了,就會分配記憶體空間,不管是否被賦值;如果是作為物件的屬性出現,只要該物件不例項化,就不會分配記憶體空間。
一個完整的Java程式執行過程會涉及以下記憶體區域:
1、暫存器:JVM內部虛擬暫存器,存取速度非常快,程式不可控制。
2、 棧:儲存區域性變數的值,包括:
1)用來儲存基本資料型別的值;
2)儲存類的例項,即堆區物件的引用(指標)
3)也可以用來儲存載入方法時的幀
3、堆:用來存放動態產生的資料,比如new出來的物件。注意創建出來的物件只包含屬於各自的成員變數,並不包括成員方法。因為同一個類的物件擁有各自的成員變數,儲存在各自的堆中,但是他們共享該類的方法,並不是每建立一個物件就把成員方法複製一次。
4、常量池:JVM為每個已載入的型別維護一個常量池,常量池就是這個型別用到的常量的一個有序集合。包括直接常量(基本型別,String)和對其他型別、方法、欄位的符號引用(1)。池中的資料和陣列一樣透過索引訪問。由於常量池包含了一個型別所有的對其他型別、方法、欄位的符號引用,所以常量池在Java的動態連結中起了核心作用。常量池存在於堆中。
5、程式碼段:用來存放從硬碟上讀取的源程式程式碼。
6、資料段:用來存放static定義的靜態成員。
注意:
1.一個Java檔案,只要有main入口方法,我們就認為這是一個Java程式,可以單獨編譯執行。
2.無論是普通型別的變數還是引用型別的變數(俗稱例項),都可以作為區域性變數,他們都可以出現在棧中。只不過普通型別的變數在棧中直接儲存它所對應的值,而引用型別的變數儲存的是一個指向堆區的指標,透過這個指標,就可以找到這個例項在堆區對應的物件。因此,普通型別變數只在棧區佔用一塊記憶體,而引用型別變數要在棧區和堆區各佔一塊記憶體。
基本型別的變數如果是臨時變數,只要定義了,就會分配記憶體空間,不管是否被賦值;如果是作為物件的屬性出現,只要該物件不例項化,就不會分配記憶體空間。
一個完整的Java程式執行過程會涉及以下記憶體區域:
1、暫存器:JVM內部虛擬暫存器,存取速度非常快,程式不可控制。
2、 棧:儲存區域性變數的值,包括:
1)用來儲存基本資料型別的值;
2)儲存類的例項,即堆區物件的引用(指標)
3)也可以用來儲存載入方法時的幀
3、堆:用來存放動態產生的資料,比如new出來的物件。注意創建出來的物件只包含屬於各自的成員變數,並不包括成員方法。因為同一個類的物件擁有各自的成員變數,儲存在各自的堆中,但是他們共享該類的方法,並不是每建立一個物件就把成員方法複製一次。
4、常量池:JVM為每個已載入的型別維護一個常量池,常量池就是這個型別用到的常量的一個有序集合。包括直接常量(基本型別,String)和對其他型別、方法、欄位的符號引用(1)。池中的資料和陣列一樣透過索引訪問。由於常量池包含了一個型別所有的對其他型別、方法、欄位的符號引用,所以常量池在Java的動態連結中起了核心作用。常量池存在於堆中。
5、程式碼段:用來存放從硬碟上讀取的源程式程式碼。
6、資料段:用來存放static定義的靜態成員。
注意:
1.一個Java檔案,只要有main入口方法,我們就認為這是一個Java程式,可以單獨編譯執行。
2.無論是普通型別的變數還是引用型別的變數(俗稱例項),都可以作為區域性變數,他們都可以出現在棧中。只不過普通型別的變數在棧中直接儲存它所對應的值,而引用型別的變數儲存的是一個指向堆區的指標,透過這個指標,就可以找到這個例項在堆區對應的物件。因此,普通型別變數只在棧區佔用一塊記憶體,而引用型別變數要在棧區和堆區各佔一塊記憶體。