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