【JVM 07-运行时常量池重要组成部分-StringTable】

StringTable 笔记记录

  • 1. 常量池、运行时常量池与字符串常量池(StringTable)的关系
  • 2. String str="a"放入字符串常量池的过程
  • 3. 常见面试题
  • 4. StringTable特性
  • 5.StringTable的位置变更
    • 5.1 为什么位置变换?
    • 5.2 位置变更演示
  • 6. StringTable垃圾回收
  • 7. StringTable性能调优
    • 7.1 考虑字符串是否入池(字符串常量池)

1. 常量池、运行时常量池与字符串常量池(StringTable)的关系

在这里插入图片描述


/*** StringTable[] 当变为字符串对象时,还会将符号当作key在StringTable中去找,看有没有取值相同的key,* 如果没有就放入,如果有就直接使用。* 也就是StringTable结构其实是一个哈希表。哈希表是长度固定的,不能进行扩容。如果没有“a”字符串对象,则* 会放入串池。StringTable ["a"],执行完String s1="a"时就会放入串池中。下一行代码类似的。**/
public class Demo {//常量池中的信息,都会被加载到运行时常量池中,这时a,b,ab,都是常量池中的符号,还没有变为java字符串对象//当执行到该行代码时://ldc #2 会把a符号变为 “a” 字符串对象//ldc #3 会把b符号变为 “b” 字符串对象//ldc #4 会把ab符号变为“ab” 字符串对象public static void main(String[] args) {//将“a”放入字符串池中是一个惰性的过程,当执行到该行代码时,才会去检查是否有。String s1="a";String s2="b";String s3="ab";}
}

这里是引用
使用javap -v class文件看具体细节。
这里能看到Constant poool;在这里插入图片描述

常量池:.class 文件中的静态数据,存储字面量和符号引用。
运行时常量池:类加载后解析的常量池,支持动态修改。
字符串常量池:运行时常量池的子集,专门存储字符串字面量。

在这里插入图片描述

2. String str="a"放入字符串常量池的过程

这里是引用

3. 常见面试题

        String s1 = "a";String s2 = "b";String s3 = "ab";//new  StringBuilder().append("a").append("b").toString;//StringBuilder的toString方法最终是new String("ab");String s4 = s1+s2; String s5="a"+"b";System.out.println(s3==s4);//false s3在字符串常量池中,s4在堆中,地址不一样。System.out.println(s3==s5);//true 编译器优化 实际上是"ab"  这里都可以利用javap -v *.class 查看字节码

String s1 = “a”;
String s2 = “b”;
String s4 = s1+s2;的底层如下
在这里插入图片描述

4. StringTable特性

  1. 常量池中的字符串仅是符号,第一次用到时才变为对象。
  2. 利用串池的机制,避免重复创建字符串对象。
  3. 字符串变量拼接的原理是StrngBuilder(1.8)
  4. 字符串常量拼接的原理是编译器优化 String s5=“a”+“b”;
  5. 可以使用intern方法,主动将串池中还没有的字符串对象放入串池
 //串池中StringTable [ "a","b"]//堆中 [ "a", "b","ab" ] 这里注意串池中没有ab,因为这里是动态拼接的变量而不是常量。如果是String str="ab",则串池中存在。String s=new String("a")+new String("b");//想要把s的ab放入串池中调用 s.intern();即可。s.intern();String s2="ab";System.out.println(s==s2);
        String x="ab";String s1=new String("a")+new String("b");String s2 = s1.intern();System.out.println(s2==x);//trueSystem.out.println(s1==x);//false x的ab已经放进去了,实际上s1.intern()放不进去了,所以s1和x不相等

这里注意JDK及7以后:
在这里插入图片描述

     String s1=new String("a")+new String("b");String s2 = s1.intern();String x="ab";System.out.println(s2==x);//trueSystem.out.println(s1==x);//true 
 String s1="a";String s2="b";String s3="a"+"b";String s4=s1+s2;String s5="ab";String s6=s4.intern();System.out.println(s3==s4);//false s3在常量池s4由StringBuilder拼接然后new String对象 在堆中System.out.println(s3==s5);//true  s3编译器优化 实际还是"ab"System.out.println(s3==s6);//trueString x2=new String("c")+new String("d");String x1="cd";x2.intern();System.out.println(x1==x2);//false x2放不进去常量池因为已经存在了,所以x2.intern()返回的是常量池中的对象

5.StringTable的位置变更

这里是引用

5.1 为什么位置变换?

这里是引用

5.2 位置变更演示

import java.util.ArrayList;
import java.util.List;/*** 演示StringTable位置* -Xmx10m* -XX:-UseGCOverheadLimit [写+就是打开开关,-就是关闭。]** -XX:-UseGCOverheadLimit 详解* 1. 作用* -XX:-UseGCOverheadLimit 是 JVM 的一个 故障保护机制开关,默认启用(-XX:+UseGCOverheadLimit)。* 它的核心作用是:* 当 JVM 检测到 GC 占用过多时间(超过 98%)但回收效果极差(释放内存 < 2%)时,抛出 OutOfMemoryError: GC Overhead Limit Exceeded 错误,防止应用陷入无限 GC。* 2. 触发条件* JVM 会在以下情况触发该错误:* GC 时间占比 > 98%(如 100ms 里 98ms 在 GC)。* GC 后内存释放 < 2%(几乎没回收空间)。* 持续超过 5 次 Full GC(不同 JVM 实现可能略有差异)。* 3. 关闭方式* 通过 -XX:-UseGCOverheadLimit 可禁用此机制,让 JVM 继续尝试 GC,而非直接报错。* 但需谨慎使用,可能让应用卡死在 GC 中!*/
public class Demo {public static void main(String[] args) {List<String> list = new ArrayList<>();int i = 0;try {for (int j = 0; j < 260000; j++) {list.add(String.valueOf(j).intern());i++;}} catch (Throwable e) {e.printStackTrace();} finally {System.out.println(i);}}
}

看报错也就知道了串池在堆空间。
在这里插入图片描述

6. StringTable垃圾回收

执行代码前的字符串常量池统计
在这里插入图片描述
往池子里加了100个对象后
在这里插入图片描述


/*** 演示StringTable垃圾回收* -Xmx10m 堆空间设置10m* -XX:+PrintStringTableStatistics 打印字符串常量池的统计信息* -XX:+PrintGCDetails -verbose:gc 打印GC信息*/
public class Demo {public static void main(String[] args) {int i=0;try {for (int j=0;j<100;j++){String.valueOf(j).intern();i++;}} catch (Exception e) {e.printStackTrace();}finally {System.out.println( i);}}
}

后面改成10000个对象

    public static void main(String[] args) {int i=0;try {for (int j=0;j<10000;j++){String.valueOf(j).intern();i++;}} catch (Exception e) {e.printStackTrace();}finally {System.out.println( i);}}

发生了GC
在这里插入图片描述
这里就证明了确实StringTable是会发生垃圾回收的。

7. StringTable性能调优

StringTable底层是哈希表。
这里是读48w个单词,-XX:StringTableSize=200000 【调整字符串常量池StringTable的大小】
这里就是动态的调整jvm参数发现执行的时间变化是很大的。在这里插入图片描述

7.1 考虑字符串是否入池(字符串常量池)

for循环10次,将480w都存入list中。
没有入池之前在这里插入图片描述> 没有入池占用到80%左右。在这里插入图片描述
入池之后
在这里插入图片描述
占用30%多左右。在这里插入图片描述
如果引用出现大量的重复字符串,可以让字符串入池,来减少字符串对象个数,节约堆内存的使用。

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

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

相关文章

算法-每日一题(DAY10)打家劫舍

1.题目链接&#xff1a; 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 2.题目描述&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xf…

android UI 布局

一&#xff1a;约束布局 参考&#xff1a; 【约束布局】ConstraintLayout 约束布局 ( 简介 | 引入依赖 | 基本操作 | 垂直定位约束 | 角度定位约束 | 基线约束 )_韩曙亮-2048 AI社区 以下是一个基于 ConstraintLayout 的简单 Android 示例&#xff0c;包含三个控件&#xff0…

【K8S】详解Labels​​ 和 ​​Annotations

在 Kubernetes&#xff08;K8s&#xff09;中&#xff0c;​​Labels&#xff08;标签&#xff09;​​ 和 ​​Annotations&#xff08;注解&#xff09;​​ 都是用于为资源对象&#xff08;如 Pod、Service、Deployment&#xff09;附加元数据的机制&#xff0c;但它们在设计…

系统模块编程与实现

设备类&#xff08;Device Class&#xff09;​​ 和 ​​设备节点&#xff08;Device Node&#xff09;​​是深入 Linux 设备管理和驱动模型的核心基础。它们就像“骨骼”与“门户”&#xff0c;共同构建了 Linux 与硬件交互的核心桥梁。 一、设备类与设备节点 1. ​​设备…

视频压缩、码率与流媒体传输知识总结

&#x1f3a5; 视频压缩、码率与流媒体传输知识总结 本笔记整理了 I/P/B 帧结构、码率计算、文件大小估算、压缩格式对比、推流带宽建议等视频工程常见技术要点。 一、单帧与未压缩视频数据量估算 分辨率&#xff1a;19201080&#xff08;1080p&#xff09; 色深&#xff1a;…

嵌入式C++学习路线

&#x1f680; 嵌入式C学习路线图 从C语言基础到嵌入式C高手的完整路径 &#x1f4cb; 学习进度追踪 总体目标&#xff1a; 20-26周完成全部学习内容 前置条件&#xff1a; C语言基础 STM32开发经验 学习方式&#xff1a; 理论学习 实践项目 阶段1: C基础过渡 (2-3周) 目标…

VSCode1.101.1Win多语言语言编辑器便携版安装教程

软件下载 【名称】&#xff1a; VSCode1.101.1 【大小】&#xff1a; 120M 【语言】&#xff1a; 简体中文 【安装环境】&#xff1a; Win10/Win11 【迅雷网盘下载链接】&#xff08;务必手机注册&#xff09;&#xff1a; 迅雷 【网站下载链接】: 其他网盘 软件介绍 VSCod…

ssh 服务和 rsync 数据同步

目录 一、ssh服务 1、概述 2、命令解析 远程登录命令 远程拷贝命令 3、登录方式配置 1、用户名密码登录 2、公钥验证登录 二、rsync 数据同步 1、rsync概述 2、rsync运行原理 3、rsync部署 一、ssh服务 1、概述 ssh服务&#xff0c;一种远程管理连接工具&#xf…

使用随机森林实现目标检测

核心实现思路 滑动窗口策略&#xff1a;在图像上滑动固定大小的窗口&#xff0c;对每个窗口进行分类多维特征提取&#xff1a;结合统计特征、纹理特征、边缘特征、形状特征等随机森林分类&#xff1a;训练二分类器判断窗口是否包含目标后处理优化&#xff1a;使用非极大值抑制…

3.6 move_base导航初体验

1.环境搭建 在工作空间src下git wpr_simulation&#xff0c;安装install_for_noetic.sh&#xff0c;然后再回退工作空间进行编译 下载参数文件 git clone https://github.com/6-robot/wpb_home.git下载需要魔法&#xff0c;在这里可以使用手机热点进行平替 进入脚本文件夹 …

Mysql高级——MVCC(多版本并发控制)

MySQL MVCC&#xff08;多版本并发控制&#xff09;详解 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;是 MySQL InnoDB 存储引擎实现的一种并发控制机制&#xff0c;用于在保证事务隔离性的同时&#xff0c;提高数据库的并发性能。下面从原理、实现、事务隔…

Oracle union连接的怎么排序

在Oracle数据库中&#xff0c;使用UNION或UNION ALL操作符来合并两个或多个查询结果时&#xff0c;如果想对这些合并后的结果进行排序&#xff0c;通常有两种方法可以实现&#xff1a; 方法1&#xff1a;在最后的查询结果上使用ORDER BY 你可以在所有使用UNION或UNION ALL合并…

uni-app总结2-所需知识储备和学习途径

使用uni-app进行跨平台开发&#xff0c;开发者不用去掌握各个平台的开发语言&#xff0c;只需一套代码即可完成多端的产品输出。那么使用uni-app需要掌握什么呢&#xff0c;这里给大家分享一下。 Vue.js uni-app里是通过Vue来开发的&#xff0c;所以首先肯定是要掌握Vue语言。…

如何高效实现公司文件管理

要实现公司文件管理的高效&#xff0c;企业应聚焦统一文件规范、部署文档管理系统、强化权限控制、推动协同编辑、实施定期清理、推进文化建设、引入可视化分析。其中&#xff0c;统一文件规范是文件高效管理的基础。若缺乏清晰的命名规则与分类体系&#xff0c;即便配备了先进…

多模态大语言模型arxiv论文略读(124)

MediConfusion: Can you trust your AI radiologist? Probing the reliability of multimodal medical foundation models ➡️ 论文标题&#xff1a;MediConfusion: Can you trust your AI radiologist? Probing the reliability of multimodal medical foundation models …

nacos的总结

服务发现与健康监测&#xff1a;Nacos 支持多种服务注册方式&#xff0c;包括 API、SDK 和 Annotation 等&#xff0c;服务消费者可以通过 DNS 或 RPC 方式方便地发现服务。其健康检查机制通过主动和被动的方式实时监测服务实例的健康状态&#xff0c;确保流量不会被发送到不健…

低轨导航 | 低轨卫星导航PNT模型,原理,公式,matlab代码

一、PNT模型原理 低轨卫星PNT(定位、导航、授时)模型利用低轨星座的快速几何构型变化和强信号特性,通过三类核心观测值实现增强定位: 几何增强原理 低轨卫星速度7km/s(比GNSS快8-10倍)5分钟内观测几何变化相当于地面站24小时变化量加速模糊度收敛和误差分离信号增强原理…

基于python的查询工具,查询手机号的卡号归属地

本文介绍了一个利用Python进行电话号码归属地查询的代码示例。代码使用requests库发送HTTP请求&#xff0c;伪装浏览器UA头&#xff0c;通过lxml库解析网页数据&#xff0c;并运用XPath提取号码归属地信息。程序构建了查询URL&#xff0c;发送GET请求后解析返回的HTML内容&…

AI面试系统选型HR应考虑哪些问题?

北森人才管理研究院发布的《2025 企业校园招聘 AI 应用实用指南》数据显示&#xff1a;全球 44% 的企业已在招聘环节部署AI技术&#xff0c;72% 的 HR 每周至少使用一次 AI 工具&#xff0c;87% 的 HR 认为 AI 能显著提升招聘效率。 来源于《北森2025 企业校园招聘 AI 应用实用…

Redis02

redis的持久化机制 1.redis为什么需要持久化 redis本身运行时数据保存在内存中&#xff0c;那么在关闭redis的进程或者关闭计算机后数据肯定被会操作系统从内存中清掉。 redis持久化方式有两种: RDB AOF redis默认采用了一种持久化方式&#xff0c;即RDB &#xff08;Redi…