Java內存解析 – JAVA編程語言程序開發技術文章

棧、堆、常量池等雖同屬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出來的東西還是放入到堆中,最後的每個元素的值則放入到常量池當中。

 

 

 

發佈留言