摘要:看深入理解虛擬機(jī)時(shí)了解到方法區(qū)中存在運(yùn)行時(shí)常量池,運(yùn)行時(shí)常量池會(huì)在類(lèi)加載時(shí)載入文件中的常量池信息。字符串和在常量池表中的,理應(yīng)應(yīng)該進(jìn)入運(yùn)行時(shí)常量池。以上是我一直以來(lái)的疑惑,字符串常量池和運(yùn)行時(shí)常量池到底是什么關(guān)系查了很多資料都是沒(méi)有說(shuō)到。
看《深入理解java虛擬機(jī)》時(shí)了解到方法區(qū)中存在運(yùn)行時(shí)常量池(Runtime Constant Pool),運(yùn)行時(shí)常量池會(huì)在類(lèi)加載時(shí)載入class文件中的常量池信息(constant_pool table)。
public class Test{ public static String a = "a"; public static void main(){ String b = "b"; } }
字符串“a”和“b”在常量池表中的,理應(yīng)應(yīng)該進(jìn)入運(yùn)行時(shí)常量池。運(yùn)行時(shí)常量池(絕大部分)是隨著JVM運(yùn)行時(shí)候,從常量池轉(zhuǎn)化而來(lái),每個(gè)Class對(duì)應(yīng)一個(gè)運(yùn)行時(shí)常量池。那么a,b不應(yīng)該在每一個(gè)class類(lèi)對(duì)應(yīng)的運(yùn)行時(shí)常量池內(nèi)么?下面是試驗(yàn)代碼
public class A { static String a = "hello"; static String b = "你好"; public String c = "hello"; public String d = "你好"; } public class B { static String a = "hello"; static String b = "你好"; String c = "hello"; String d = "你好"; } public class Test { @org.junit.Test public void test(){ System.out.println(A.a == B.a); System.out.println(A.b == B.b); A a = new A(); B b = new B(); System.out.println(a.c == b.c); System.out.println(a.d == b.d); System.out.println(A.a == a.c); System.out.println(A.b == a.d); String c = new String("hello"); System.out.println(c == A.a); System.out.println(c.intern() == A.a); } }
實(shí)驗(yàn)結(jié)果(JDK8)
true true true true true true false true
說(shuō)明字符串“a”和“b”都是一塊內(nèi)存地址。關(guān)于常量池還有一個(gè)概念就是字符串常量池(String Pool)。String Pool是JVM實(shí)例全局共享的,全局只有一個(gè)。所以“a”和“b”這兩個(gè)字符串應(yīng)該是在字符串常量池內(nèi),全局共享。
以上是我一直以來(lái)的疑惑,字符串常量池和運(yùn)行時(shí)常量池到底是什么關(guān)系?查了很多資料都是沒(méi)有說(shuō)到。運(yùn)行時(shí)常量池是在方法區(qū)內(nèi),同時(shí)《深入理解java虛擬機(jī)》說(shuō)到
在目前已經(jīng)發(fā)布的JDK1.7的HotSpot中,已經(jīng)把原本放在永久帶的字符串常量池移除
所以個(gè)人覺(jué)得字符串常量池應(yīng)該是在堆中表示常量的常量池,而運(yùn)行時(shí)常量池是在方法區(qū)中。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/69400.html
摘要:那方法區(qū)里都存著什么呢先拋結(jié)論靜態(tài)變量常量類(lèi)信息構(gòu)造方法接口定義運(yùn)行時(shí)常量池存在方法區(qū)中。動(dòng)態(tài)常量池運(yùn)行時(shí)常量池是方法區(qū)的一部分,是一塊內(nèi)存區(qū)域。文件常量池將在類(lèi)加載后進(jìn)入方法區(qū)的運(yùn)行時(shí)常量池中存放。 一、方法區(qū)與永久代 這兩個(gè)是非常容易混淆的概念,永久代的對(duì)象放在方法區(qū)中,就會(huì)想當(dāng)然地認(rèn)為,方法區(qū)就等同于持久代的內(nèi)存區(qū)域。事實(shí)上兩者是這樣的關(guān)系: 《Java虛擬機(jī)規(guī)范》只是規(guī)定了有方...
摘要:為了減少在中創(chuàng)建的字符串的數(shù)量,字符串類(lèi)維護(hù)了一個(gè)字符串常量池。但是當(dāng)執(zhí)行了方法后,將指向字符串常量池中的那個(gè)字符串常量。由于和都是字符串常量池中的字面量的引用,所以。究其原因,是因?yàn)槌A砍匾4娴氖且汛_定的字面量值。 String,是Java中除了基本數(shù)據(jù)類(lèi)型以外,最為重要的一個(gè)類(lèi)型了。很多人會(huì)認(rèn)為他比較簡(jiǎn)單。但是和String有關(guān)的面試題有很多,下面我隨便找兩道面試題,看看你能不能...
摘要:作為本系列的第一章就從內(nèi)存模型開(kāi)始說(shuō)起。這這塊內(nèi)存區(qū)域有可能發(fā)生兩種異常。新生代的一塊內(nèi)存空間,它是新小對(duì)象出生的地方,當(dāng)沒(méi)有足夠的空間進(jìn)行分配的時(shí)候,發(fā)生一次。 一、前言 手上的這本《深入理解Java虛擬機(jī)》這本書(shū)買(mǎi)來(lái)已接近2年,期間也是看看停停,現(xiàn)如今也才只看到前10章(來(lái)回倒騰的看)。寫(xiě)這個(gè)專(zhuān)題的目的:1、作一個(gè)專(zhuān)題復(fù)習(xí),老話說(shuō)的好:好記性不如爛筆頭,正好也可以把自己的一些理解記...
摘要:內(nèi)存模型和運(yùn)行時(shí)數(shù)據(jù)區(qū)域的關(guān)系主內(nèi)存對(duì)應(yīng)著堆,工作內(nèi)存對(duì)應(yīng)著棧。在的單例模式中有運(yùn)用到二運(yùn)行時(shí)數(shù)據(jù)區(qū)域內(nèi)存區(qū)域因?yàn)榈倪\(yùn)行時(shí)數(shù)據(jù)區(qū)域一直在改善,所以不同版本之間會(huì)有不同。 一、java內(nèi)存模型 showImg(https://segmentfault.com/img/remote/1460000016694250?w=1810&h=941); java定義內(nèi)存模型的目的是:為了屏蔽各種...
摘要:的三種常量池此外,有三種常量池,即字符串常量池又叫全局字符串池文件常量池運(yùn)行時(shí)常量池。開(kāi)始虛擬機(jī)把字符串常量池位置從永久代挪到堆,又徹底取消,把諸如之類(lèi)的元數(shù)據(jù)都挪到堆之外管理。 前言 前陣子和朋友討論一個(gè)問(wèn)題: 字符串常量歸常量池管理,那比如 String str = abc; abc這個(gè)對(duì)象是放在內(nèi)存中的哪個(gè)位置,是字符串常量池中還是堆? 這句代碼的abc當(dāng)然在常量池中,只有n...
閱讀 964·2021-11-24 10:42
閱讀 3475·2021-11-19 11:34
閱讀 2605·2021-09-29 09:35
閱讀 2525·2021-09-09 09:33
閱讀 642·2021-07-26 23:38
閱讀 2515·2019-08-30 10:48
閱讀 1385·2019-08-28 18:07
閱讀 422·2019-08-26 13:44