JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析
生活随笔
收集整理的這篇文章主要介紹了
JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- Pre
- 案例
- 答案
- 字符串常量池在不同JDK版本的位置變化
- JDK1.7(含)+
- JDK1.6
- intern源碼
Pre
JVM - 深入剖析字符串常量池
案例
String str2 = new StringBuilder("計算機").append("技術").toString();System.out.println(str2 == str2.intern()); String s2 = new StringBuilder("計算機技術").toString();System.out.println(s2 == s2.intern());讀者可以先自行推演一下答案 ,是不是所有的JDK版本都是一樣的? 還是說不同的JDK版本的答案不盡相同 ?
答案
String str2 = new StringBuilder("計算機").append("技術").toString();System.out.println(str2 == str2.intern()); //1.8 true 1.6 falseString s2 = new StringBuilder("計算機技術").toString();System.out.println(s2 == s2.intern()); //1.8 false 1.6 false【1.6 】
【1.7 】
【1.8】
字符串常量池在不同JDK版本的位置變化
- Jdk1.6及之前: JVM存在永久代, 運行時常量池在永久代,運行時常量池包含字符串常量池
- Jdk1.7:有永久代,但已經逐步“去永久代”,字符串常量池從永久代里的運行時常量池分離到堆里
- Jdk1.8及之后: 無永久代,變成了元空間,運行時常量池在元空間,字符串常量池里依然在堆里
String中的intern方法是一個 native 的方法
-
JDK1.7(含) + ,當調用 intern方法時,如果池已經包含一個等于此String對象的字符串(用equals(oject)方法確定),則返回池中的字符串, 否則,將intern返回的引用指向當前字符串 。
-
jdk1.6版本需要將 s1 復制到字符串常量池里
JDK1.7(含)+
JDK1.6
明白了哈
intern源碼
intern 在JDK里是native ,所以只能找C++的代碼了。
JDK8對應的哈
看看basic_add 返回的啥
oop : ordinary object pointer 指針
加入到常量池,這個常量池StringTable , 也是個hash結構 ,最后返回string(), 這其實是個指針引用。
so ~ , 這樣就好理解intern機制了吧 。
總結
以上是生活随笔為你收集整理的JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM - 基本类型的包装类和对象池
- 下一篇: JVM - Class常量池 || 运行