java記憶體配置,java分配
棧中存基本型的局部變數資料和對象的引用。
一般Java在記憶體配置時會涉及到以下地區:
◆寄存器:我們在程式中無法控制
◆棧:存放基本類型的資料和對象的引用,但對象本身不存放在棧中,而是存放在堆中(new 出來的對象)
◆堆:存放用new產生的資料
◆靜態域:存放在對象中用static定義的靜態成員
◆常量池:存放常量
◆非RAM儲存:硬碟等永久儲存空間
棧:方法中定義的一些基本類型的變數資料和對象(和形式參數)的引用變數都在棧記憶體中分配,棧記憶體中的局部變數隨著方法的消失而消失。存在棧中的資料可以共用
堆:存放由new建立的對象和數組,由GC管理。棧中定義引用變數,其取值等於數組或對象在堆記憶體中的首地址。引用變數在程式運行到其範圍之外後被釋放。而數組和對象不會,他們只有在沒有引用變數指向它的時候才會被GC在適當時機回收。
class BirthDate { private int day; private int month; private int year; public BirthDate(int d, int m, int y) { day = d; month = m; year = y; } } public class Test{ public static void main(String args[]){ int date = 9; Test test = new Test(); test.change(date); BirthDate d1= new BirthDate(7,7,1970); } public void change1(int i){ i = 1234; }}
下面分析一下代碼執行時候的變化:
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()將等待記憶體回收。
常量池:常量池指在編譯期被確定,並被儲存在已編譯的.class檔案中的資料。
除了包含代碼中所定義的各種基本類型和對象型的常量值(final)還包含一些以文本形式出現的符號引用,比如:
◆類和介面的全限定名;
◆欄位的名稱和描述符;
◆方法的名稱和描述符;
String類型在編譯期已經建立好(直接用雙引號定義的)的就儲存在常量池中,如果是運行期(new出來的)才能確定的就儲存在堆中。
參考:http://blog.csdn.net/truelove12358/article/details/38139843