JVM——3.StringTable字符串常量池

news2025/1/16 3:49:27

这篇文章我们来讲一下StringTable字符串常量池

目录

1.引例

2.StringTable的特性

3.StringTable的位置

4.StringTable的垃圾回收、

5.StringTable性能调优

6.总结

1.引例

首先,我们来看下面的这段程序,请思考最终的输出结果。

输出结果:

解释:

首先,我们的程序会被JDK中的编译器编译成java的二进制字节码文件,然后通过类加载器将其加载到JVM的内存的栈中,其中会生成一个常量池(就是一张常量池表),里面放在这个类编译后的各种字面量和符号注意,此时常量池中只存储了这些字面量的符号,没有生成具体对象。举个例子来说,就比如第7行的a,它在常量池中可能就是用一个符号25来表示的,没有具体的String类型的变量a,也不会开辟新的空间来存储a。然后根据程序计数器来一步一步的运行该程序。当执行到这一行,常量池中的信息会被加载到运行时常量池中,常量池中原本记录的符号也会变为真实的地址,即符号25变为地址25,并且会在堆中开辟一块空间存储String类型的变量a,这块开辟的空间就称为串池(即字符串常量池,即StringTable),它在堆中,其中里面一开始时是空的,当运行到这一行时,会把a放入里面,a的地址为25(假设的)。这就是整体的流程。然后就是依次在串池中放入b和ab。当执行到第10行时,它创建的是一个StringBuild对象,放入s1的值即a,然后调用StringBuilder的方法,进行字符串拼接。然后再创建一个新的String对象,里面放的就是拼接后的结果,即ab,很明显,s4中的ab是在堆中的,而"=="符号判断的是两个对象的地址是否相等,所以很明显,第14行输出false。当程序运行到第11行时,jvm会先在串池中找是否有ab,找到了,那么就不再创建新的对象了,就直接把这个ab的地址赋予s5,所以第15行输出true。下面再看第9行,这种字符常量相加的是直接相加的,没有创建对象调用方法。所以最后相加的结果就直接放在运行时常量池的串池中,所以第14行输出false,第15行输出true。对比着看第9行和第10行,第9行javac在编译时进行了优化,因为第9行是两个字符常量相加的,最终的结果是一定的,不会变的,所以就直接加,然后放到串池中。而第10行是因为这是两个变量相加,不确定最后的结果,所以就使用了StringBuilder类对象来进行操作。多说一句,字符串还具有延迟实例化的特点,具体来说就是在编译结束后不会直接实例化该字符串,直到代码运行到这一句的时候才会实例化出具体的字符串,并放入内存中。

下面再来看一下第12行,第12行调用了intern方法。这个方法的作用是主动将串池中还没有的字符串对象放入串池。第12行是s4调用了intern方法的,我们知道,s4的引用是指向堆内存中的ab的,s4调用这个方法,jvm会先看运行时常量池中有没有ab这个字符对象,如果没有,那么就把堆中的ab放入到运行时常量池中,注意,放入后,堆中就没有这个ab了;如果jvm发现运行时常量池中有这个ab对象,那么就直接把s6的引用指向它。这就是intern的作用。

这里关联一下字符串的不可变性,字符串的不可变性是一个引用多个对象,而这里将的是多个引用一个"对象"(不是一个对象,仅仅是值相等而已)

2.StringTable的特性

下面看一下StringTable的特性:

  1. 常量池中的字符串仅是符号,第一次用到时才变为对象
  2. 利用串池的机制,可以避免重复创建字符串对象
  3. 字符串变量拼接的原理是StringBuilder (1.8)
  4. 字符串常量拼接的原理是编译期优化
  5. 可以使用intern方法,主动将串池中还没有的字符串对象放入串池

注意:在jdk1.8以后,intern方法是把堆中对象的值挪到串池中,1.8以前,是将堆中的值复制一份,然后放到串池中。这一点需要注意。


3.StringTable的位置

下面来看一下StringTable的位置,如下图所示:

如图所示,在jdk1.8以后,StringTable就在堆中了。StringTable就是字符串常量池!

4.StringTable的垃圾回收、

这里我们只需要了解StringTable是可以进行垃圾回收的,具体是怎么回收的,我们后面将GC的时候会具体的讲,这里就不多说了。

5.StringTable性能调优

StringTable的底层的哈希表,StringTable进行性能调优就是要调整哈希表。

性能调优的方法:

  • 调整 -XX:StringTableSize=桶个数
  • 考虑将字符串对象是否入池

6.总结

这篇文章我们主要讲解了StringTable。下面总结一下。

StringTable,即字符串常量池,是存储字符串对象用的,在堆中。一个字符串,在被编译后,是不会创建对象的,仅仅只会在常量池中存储一个符号,只有当运行到这行代码的时候,才会在字符串常量池中创建对象,这就是字符串的懒加载,也是延迟加载。然后在字符串常量池中,也可以避免创建重复的对象。即如果StringTable中已经有了该对象,那么如果再有引用需要创建相同值的对象的时候,该引用会直接指向这个对象,就避免了重复创建。StringTable还可以进行垃圾回收。还讲述了StringTable的性能调优的两点策略。这就是本篇文章的所有内容。


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1016433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全(黑客)自学​

前言 作为一个合格的网络安全工程师,应该做到攻守兼备,毕竟知己知彼,才能百战百胜。 计算机各领域的知识水平决定你渗透水平的上限。 【1】比如:你编程水平高,那你在代码审计的时候就会比别人强,写出的漏洞…

北大C++课后记录:文件读写的I/O流

前言 文件和平常用到的cin、cout流其实是一回事,可以将文件看作一个有限字符构成的顺序字符流,基于此,也可以像cin、cout读键盘数据那样对文件进行读写。 读写指针 输入流的read指针 输出流的write指针 注:这里的指针并不是普…

Type-C座子ESD整改案例分析?|深圳比创达EMC

Type-C座子ESD整改案例分析?相信不少人是有疑问的,今天深圳市比创达电子科技有限公司就跟大家解答一下! 近年来,Type-C座子是一个应用非常广泛的一款通讯端口,具有正反可插、更快的充电和数据传输、音频转换、接口转换…

摩托车题目 记录

1 《道路安全法实施条例》第五十五条第三例:摩托车后座不得乘坐未满12周岁的未成年人,轻便摩托车不得载人。 所以本题选择【错误】。 《道路交通安全法实施条例》第六十二条:驾驶机动车不得有下列行为:(六)驾驶摩托车手离车把或者在车把上悬挂物品。所以&#xff0…

LeetCode2.两数相加

一看完题,我的想法是先算出这两个链表表示的数,然后相加,然后把这个数一位一位的分配给第三个数组,这种方法应该很简单但是要遍历三次数组,于是我就想直接一遍遍历,两个链表同时往后面遍历,把这…

【Unity 实用工具篇】✨ | 编辑器扩展插件 Odin Inspector,快速上手学习

前言【Unity 实用工具篇】✨ | 编辑器扩展插件 Odin Inspector,快速上手学习一、Odin Inspector插件1.1 介绍1.2 相关网站链接1.3 效果展示二、导入插件三、基础功能介绍四、快速上手4.1 Attributes 相关4.1.1 使用Attribute更好的显示数据。Title、BoxGroup、FoldoutGroup4.1…

ruoyi权限设置的坑

如果是手动在页面加了菜单,其实会生成一条数据,也就是2001这条已经有了。 所以生成的SQL就会有重的,这一点要注意。 可以不手动创建菜单,直接使用SQL,或者就改SQL了。 手动页面创建的菜单,一个定要注意&…

Haproxy搭建 Web 群集实现负载均衡

目录 1 Haproxy 1.1 HAProxy的主要特性 1.2 HAProxy负载均衡策略 1.3 LVS、Nginx、HAproxy的区别 2 Haproxy搭建 Web 群集 2.1 haproxy 服务器部署 2.1.1 关闭防火墙 2.1.2 内核配置(实验环境可有可无) ​2.1.3 安装 Haproxy 2.1.4 Haproxy服务…

数额结构(6.1~6.8)

6-1链表的插入算法 题目: 代码 int InsertPost_link(LinkList llist,DataType x,DataType y) {LinkList mllist->next;LinkList n;while(m->data!x){mm->next;4if(mNULL){printf("not exist data %d\n",x);return 0;}}n(LinkList)malloc(si…

Navicat工具连接Oracle数据库

文章目录 准备工具NavicatNavicat的Oracle插件Oracle查看系统版本找到对应的工具版本下载 oci下载 sqlplus 步骤1.打开navicat,工具>选项>环境2.配置3.点击确定,并重启navicat4.创建oracle连接 准备工具 工欲善其事,必先利其器&#x…

《Python趣味工具》——自制emoji2(2)

今天,我们将会完成以下2个内容: 绘制静态emoji总结turtle中常用的绘图函数 文章目录 一、绘制静态emoji::sparkles: 画脸::sparkles:绘制嘴巴::sparkles:绘制眼白:绘制眼白-Part1:绘制眼白—pa…

算法之排序

文章目录 前言一、二分查找1、正常二分2、二分找第一个出现要查找的数的位置3、在旋转数组中找最小数字二分总结 一、归并排序1、正常归并2、小和问题归并总结 前言 之前我们学习了各种排序算法,今天来让我们看看在线OJ上的题目吧,有哪些排序算法有什么…

数据结构之美:如何优化内存和性能

文章目录 什么是数据结构?内存优化使用紧凑的数据类型避免冗余存储使用位运算压缩数据 性能优化使用适当的数据结构减少不必要的复制使用合适的算法 数据结构优化的案例分析结论 🎉欢迎来到数据结构学习专栏~探索数据结构之美:如何优化内存和…

滑动窗口 解题思路

文章目录 算法应用场景滑动窗口解题思路1. 寻找最长2. 寻找最短 算法应用场景 关键词: 满足 xxx 条件 (计算结果,出现次数,同时包含) 最长 / 最短 子串 / 子数组 / 子序列 例如:长度最短的子串 滑动窗口…

EasyX库的下载及基本作图函数的使用【VS编译器】

目录 1、EasyX库的下载 2、基本作图函数 2.1 initgraph() 2.2 setbkcolor() 2.3 circle() 2.4 rectangle(); 2.5 ellipse() 2.6 pie() 2.7 线line() 点putpixel() 多线ployline() 1、EasyX库的下载 直接在官方网站下载一个安装程序:EasyX 库https://easyx.c…

(八)VBA常用基础知识:workbooks操作之打开workbook

打开(六)创建的excel Function Open(FileName As String, [UpdateLinks], [ReadOnly], [Format], [Password], [WriteResPassword], [IgnoreReadOnlyRecommended], [Origin], [Delimiter], [Editable], [Notify], [Converter], [AddToMru], [Local], [C…

Selenium+python怎么搭建自动化测试框架、执行自动化测试用例、生成自动化测试报告、发送测试报告邮件

本人在网上查找了很多做自动化的教程和实例,偶然的一个机会接触到了selenium,觉得非常好用。后来就在网上查阅各种selenium的教程,但是网上的东西真的是太多了,以至于很多东西参考完后无法系统的学习和应用。 以下整理的只是书中…

学信息系统项目管理师第4版系列08_管理科学基础

1. 科学管理的实质 1.1. 反对凭经验、直觉、主观判断进行管理 1.2. 主张用最好的方法、最少的时间和支出,达到最高的工作效率和最大的效果 2. 资金的时间价值与等值计算 2.1. 资金的时间价值是指不同时间发生的等额资金在价值上的差别 2.2. 把资金存入银行&…

肖sir__mysql之视图__009

mysql之视图 一、什么是视图 视图是一个虚拟表(逻辑表),它不在数据库汇总以存储的形式保存(本身不包含数据),视图是动态生成 二、视图的作用? 1、解决数据库中的非常复杂的数据查询 比如&#…

Unity SteamVR 开发教程:用摇杆/触摸板控制人物持续移动(2.x 以上版本)

文章目录 📕教程说明📕场景搭建📕创建移动的动作📕移动脚本⭐移动⭐实时调整 CharacterController 的高度 📕取消手部和 CharacterController 的碰撞 持续移动是 VR 开发中的一个常用功能。一般是用户推动手柄摇杆&…