JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析

简介: JVM - 一个案例反推不同JDK版本的intern机制以及intern C++源码解析

20200712003202517.png

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 false
        String s2 = new StringBuilder("计算机技术").toString();
        System.out.println(s2 == s2.intern());  //1.8 false    1.6 false 


【1.6 】

20200712170632176.png

【1.7 】


20200712170808392.png

【1.8】



20200712171037547.png


字符串常量池在不同JDK版本的位置变化


Jdk1.6及之前: JVM存在永久代, 运行时常量池在永久代,运行时常量池包含字符串常量池

Jdk1.7:有永久代,但已经逐步“去永久代”,字符串常量池从永久代里的运行时常量池分离到堆里

Jdk1.8及之后: 无永久代,变成了元空间,运行时常量池在元空间,字符串常量池里依然在堆里


String中的intern方法是一个 native 的方法


JDK1.7(含) + ,当调用 intern方法时,如果池已经包含一个等于此String对象的字符串(用equals(oject)方法确定),则返回池中的字符串, 否则,将intern返回的引用指向当前字符串 。


jdk1.6版本需要将 s1 复制到字符串常量池里


JDK1.7(含)+

20200712224255430.png

JDK1.6


20200712224244643.png

明白了哈


intern源码

intern 在JDK里是native ,所以只能找C++的代码了。

JDK8对应的哈


20200712235002244.png

20200712235124647.png


看看basic_add 返回的啥


20200712235213494.png


oop : ordinary object pointer 指针

2020071223530337.png


20200712235343990.png


加入到常量池,这个常量池StringTable , 也是个hash结构 ,最后返回string(), 这其实是个指针引用。

so ~ , 这样就好理解intern机制了吧 。

相关文章
|
13天前
|
存储 机器学习/深度学习 搜索推荐
深入解析矢量数据库的数据模型与索引机制
【4月更文挑战第30天】本文深入探讨了矢量数据库的数据模型和索引机制。向量数据库以高维向量表示数据,采用稀疏或密集向量形式,并通过数据编码和组织优化存储与检索。索引机制包括基于树的(如KD-Tree和Ball Tree)、基于哈希的(LSH)和近似方法(PQ),加速相似性搜索。理解这些原理有助于利用矢量数据库处理大规模高维数据,应用于推荐系统、图像搜索等领域。随着技术发展,矢量数据库将扮演更重要角色。
|
1天前
|
开发框架 搜索推荐 安全
【Uniapp 专栏】基于 Uniapp 的电商应用开发案例解析
【5月更文挑战第12天】使用Uniapp跨平台框架开发电商应用,结合丰富的组件和API,实现首页、商品详情、购物车及订单等关键功能。注重界面设计和用户体验,处理商品逻辑、订单管理和支付接口集成。同时,适应多平台特性,加入个性化推荐、商品直播和社交分享等特色功能,以降低成本、提升竞争力,打造高效购物体验。此案例展示了Uniapp在电商领域的潜力和优势。
|
7天前
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
|
7天前
|
Java Spring 容器
【AOP入门案例深解析】
【AOP入门案例深解析】
17 2
|
12天前
|
C++
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
|
12天前
|
Serverless C++ 容器
【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P5】大二C++实验作业-多态性(3道代码题)【解析,注释】
|
12天前
|
C++ 芯片
【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】
|
12天前
|
编译器 C++
【期末不挂科-C++考前速过系列P3】大二C++第3次过程考核(20道选择题&12道判断题&2道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P3】大二C++第3次过程考核(20道选择题&12道判断题&2道代码题)【解析,注释】
|
12天前
|
C++
【期末不挂科-C++考前速过系列P2】大二C++第2次过程考核(20道选择题&10道判断题&3道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P2】大二C++第2次过程考核(20道选择题&10道判断题&3道代码题)【解析,注释】
|
12天前
|
PHP 开发者
深入解析PHP的命名空间与自动加载机制
【4月更文挑战第30天】 在现代PHP开发实践中,命名空间和自动加载机制是模块化和代码复用的关键。本文旨在提供一个全面的视角来理解这两个概念如何协同工作以优化项目结构。我们将探讨命名空间解决代码冲突的方式,以及自动加载机制如何智能地按需加载类,从而减少内存占用和提升性能。

推荐镜像

更多