Java進階(一)Java記憶體解析
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
棧、堆、常量池等雖同屬Java記憶體分配時操作的區域,但其適用範圍和功用卻大不相同。本文將深入Java核心,簡單講解Java記憶體分配方面的知識。
首先我們先來講解一下記憶體中的各個區域。
stack(棧)
存放基本型別的資料和物件的引用,即存放變數。
如果存放的是基本型別資料(非靜態變數),則直接將變數名和值存入stack中的記憶體中;
如果是引用型別,則將變數名存入棧,然後指向它new出的物件(存放在堆中)。
heap(堆)
存放new產生的資料。
data segment
分為靜態域和常量域。
靜態域
存放在物件中用static定義的靜態成員(即靜態變數,同理,如果該靜態變數是基本型別則將變數名和值存入靜態域,如果是引用型別則指向new出的物件)。
常量池
常量池指的是在編譯期被確定,並被儲存在已編譯的.class檔案中的一些資料。除了包含程式碼中所定義的各種基本型別(如int、long等)和物件型(如String及陣列)的常量值(final)還包含一些以文字形式出現的符號引用,比如:類和介面的全限定名;欄位的名稱和描述符;方法和名稱和描述符。
code segment:存放程式碼。
下面我來舉幾個簡單的小例子來讓大家認識一下這幾個區域具體存放的內容:
注:例1和例2中大家要注意String型別不是基本資料型別,所以它可以建立物件,並且它的值是放在常量池中的。
例1. 非靜態和靜態變數的建立
String str = "abc"; static Int a = 10; //建立String型別的變數str;建立Int型別變數a
記憶體解析:
這裡的str是非靜態變數所以將其放入到棧中,而靜態變數a則需要放入靜態域中,對於變數值"abc"和10則都應該放入到常量池當中
例2. 物件的建立
String str=new String("abc"); //建立String型別的物件str
記憶體解析:
這裡的str是String型別的物件,所以放入棧中,而new出來的東西則放入到堆中,對於初始值"abc"則放入到常量池中即可。
例3. 陣列的建立
Int s[] = new Int[3];s[0]=3;s[1]=2;s[2]=3;
記憶體解析:
這裡的s[]是一個數組變數,所以放入到棧中,new出來的東西還是放入到堆中,最後的每個元素的值則放入到常量池當中。