- 1、java中棧內存可以存儲常量嗎
- 2、java中的String常量是存放在棧中還是堆中?
- 3、java 常量池 到底是在堆中還是棧中?
- 4、java中的棧只存儲局部變量嗎?
- 5、java中 關於常量池 棧內存 堆內存
- 6、Java中,實例中的常量是在堆中還是方法區
一個完整的Java程序運行過程會涉及以下內存區域:
寄存器:JVM內部虛擬寄存器,存取速度非常快,程序不可控制。
棧:保存局部變量的值,包括:1.用來保存基本數據類型的值;2.保存類的實例,即堆區對象的引用(指針)。也可以用來保存加載方法時的幀。
堆:用來存放動態產生的數據,比如new出來的對象。注意創建出來的對象只包含屬於各自的成員變量,並不包括成員方法。因為同一個類的對象擁有各自的成員變量,存儲在各自的堆中,但是他們共享該類的方法,並不是每創建一個對象就把成員方法複製一次。
常量池:JVM為每個已加載的類型維護一個常量池,常量池就是這個類型用到的常量的一個有序集合。包括直接常量(基本類型,String)和對其他類型、方法、字段的符號引用。池中的數據和數組一樣通過索引訪問。由於常量池包含了一個類型所有的對其他類型、方法、字段的符號引用,所以常量池在Java的動態鏈接中起了核心作用。常量池存在於堆中。
代碼段:用來存放從硬盤上讀取的源程序代碼。
數據段:用來存放static定義的靜態成員。
對於局部變量,如果是基本類型,會把值直接存儲在棧;如果是引用類型,比如String s = new String(“william”);會把其對象存儲在堆,而把這個對象的引用(指針)存儲在棧。
再如
String s1 = new String(“william”);
String s2 = s1;
s1和s2同為這個字符串對象的實例,但是對象只有一個,存儲在堆,而這兩個引用存儲在棧中。
類的成員變量在不同對象中各不相同,都有自己的存儲空間(成員變量在堆中的對象中),基本類型和引用類型的成員變量都在這個對象的空間中,作為一個整體存儲在堆。而類的方法卻是該類的所有對象共享的,只有一套,對象使用方法的時候方法才被壓入棧,方法不使用則不佔用內存。
系統內存一般情況來說分為四個
heap 堆 放 對象 也就是new 出來的東西
stack 棧 放局部變量
static segment 靜態區 用來放 靜態變量 和字符串常量
data segement 代碼區 用來放代碼的
如果 一個字符串是 String s = “abc”;它放在棧里
如果一個字符串 用創建對象的方式 String s = new String(“abc”);
那它是放在了 堆里 而如果單純的 一個 “abc” 這個輸入字符串常量 是放在static segement里
java常量池不在堆中也不在棧中,是獨立的內存空間管理。
1. 棧:存放基本類型的變量數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字符串常量對象存放在常量池中。)
2. 堆:存放所有new出來的對象。
3. 常量池:存放字符串常量和基本類型常量(public static final)。
對於字符串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等的字符串,在常量池中永遠只有一份,在堆中有多份。
不是,樓上回答的已經很完善了,棧裡面存放基本類型的變量數據和對象的引用,比如int i=1;這是放在棧裡面的;String s=new String(“123”);這個裡面,s是放在棧裡面的,而new出來的String類型對象是放在堆里的。
區分放在地方是看類型決定不是作用域決定的哈
不明白可以追問
Java中所有局部變量和對象的引用都是存儲在棧內存中的,int a = 1;它是局部變量肯定是在棧內存,但是它與常量池沒有關係;
常量池是堆內存中的一部分,專門用來存儲字符串常量;所以String a=”abc”中,引用a是存儲在棧內存的,指向常量池中的”abc”;
但是如果是String a = new String(“abc”);就又不一樣了,對於通過構造函數得到的”abc”字符串對象,引用a還是在棧內存,但是”abc”不會存到字符串常量池中,而是在常量池之外的其他堆內存中再生成一個”abc”,由於這個對象與原先常量池中的”abc”對象是equal關係,它們之間會建立起一種聯繫;
java常量池不在堆中也不在棧中,是獨立的內存空間管理。
1. 棧:存放基本類型的變量數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字符串常量對象存放在常量池中。)
2. 堆:存放所有new出來的對象。
3. 常量池:存放字符串常量和基本類型常量(public static final)。
對於字符串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等的字符串,在常量池中永遠只有一份,在堆中有多份。
原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/126903.html