【JVM--StringTable字符串常量池】

news2024/9/28 23:29:09

文章目录

  • 1. String 的基本特性
  • 2. 字符串拼接操作
  • 3. intern()的使用
  • 4. StringTable 的垃圾回收

1. String 的基本特性

  • String 声明为 final 的,不可被继承
  • String 实现了 Serializable 接口:表示字符串是支持序列化的。
  • String 实现了 Comparable 接口:表示 string 可以比较大小
  • String 在 jdk8 及以前内部定义了 final char[] value 用于存储字符串数据。JDK9 时改为 byte[]

String 的 String Pool 是一个固定大小的 Hashtable

2. 字符串拼接操作

  • 常量常量的拼接结果在常量池,原理是编译期优化
  • 只要其中有一个是变量,结果就在中。变量拼接的原理是== StringBuilder==
  • 如果拼接的结果调用 intern()方法,则主动将常量池中还没有的字符串对象放入池中,并返回此对象地址(将堆中字符串的地址写到字符串常量池这个位置,字符串常量池中存的是堆中对象的引用)

常量与常量拼接,编译期优化:

在这里插入图片描述

只要有一个变量,就是在堆中,用string builder拼接,最后返回.tostring变为字符串

在这里插入图片描述

不使用 final 修饰,即为变量。如 s3 行的 s1 和 s2,会通过 new StringBuilder 进行拼接
使用 final 修饰,即为常量。会在编译器进行代码优化。在实际开发中,能够使用 final 的,尽量使用

在这里插入图片描述

3. intern()的使用

DK1.7 起,将这个字符串对象尝试放入串池。

  • 如果串池中有,则并不会放入。返回已有的串池中的对象的地址
  • 如果没有,则会把对象的引用地址(就是将堆中这个对象的地址)复制一份,放入串池,并返回串池中的引用地址

4. StringTable 的垃圾回收

许多大规模的 Java 应用的瓶颈在于内存,测试表明,在这些类型的应用里面,Java 堆中存活的数据集合差不多 25%是 String 对象。更进一步,这里面差不多一半 string 对象是重复的,重复的意思是说: stringl.equals(string2)= true堆上存在重复的 String 对象必然是一种内存的浪费。这个项目将在 G1 垃圾收集器中实现自动持续对重复的 string 对象进行去重,这样就能避免浪费内存。

实现

  1. 当垃圾收集器工作的时候,会访问堆上存活的对象。对每一个访问的对象都会检查是否是候选的要去重的 String 对象
  2. 如果是,把这个对象的一个引用插入到队列中等待后续的处理。一个去重的线程在后台运行,处理这个队列。处理队列的一个元素意味着从队列删除这个元素,然后尝试去重它引用的 string 对象。
  3. 使用一个 hashtable 来记录所有的被 String 对象使用的不重复的 char 数组。当去重的时候,会查这个 hashtable,来看堆上是否已经存在一个一模一样的 char 数组。
  4. 如果存在,String 对象会被调整引用那个数组,释放对原来的数组的引用,最终会被垃圾收集器回收掉。
  5. 如果查找失败,char 数组会被插入到 hashtable,这样以后的时候就可以共享这个数组了。

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

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

相关文章

求臻人故事 | 在求臻医学的沃土中,我像竹子般茁壮成长

在这个快节奏的社会中,我们时常忽略了身边的“小人物”,他们或许默默无闻,或许平凡无奇,但他们的经历、奋斗和成就,却能给我们带来深深的启示。让我们一起走进每个平凡的求臻人世界,聆听他们的“大故事”&a…

Direct3D网格(一)

创建网格 我们可以用D3DXCreateMeshFVF函数创建一个"空"网格对象 ,空网格对象是指我们指定了网格的面片总数和顶点总数,然后由该函数为顶点缓存、索引缓存和属性缓存分配大小合适的内存,之后即可手工填入网格数据。 HRESULT WINA…

供水管网监测系统

随着城市人口的不断增长和经济的快速发展,供水管网的安全和可靠性变得尤为重要。在过去,供水管网的监测往往是依靠人工巡查,这种方式不仅费时费力,而且容易出现疏漏和盲区。然而,随着科技的进步,供水管网监…

【算法|动态规划No.16】leetcode931. 下降路径最小和

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

智能售后工单系统是什么?智能工单系统有什么用?

对于传统的客服问题处理机制中,如果使用智能工单详细记录客户的问题以及解决问题的全过程,可以有效地帮助客服中心或业务管理层从总体层面了解客户的问题,给出有效的解决方案以及处理问题的紧急程度。从每个服务分支到问题,基于大…

361154-30-5|点击糖化学试剂Ac4ManNAz

产品简介:N-叠氮乙酰基甘露糖胺-三酰化(AC4MANAZ)可用作标记试剂,点击糖化学试剂,叠氮化物基团允许它与炔烃反应,是一种含叠氮的代谢糖蛋白标记试剂,叠氮化物修饰的蛋白质可以通过与炔烃反应检测…

基于springboot实现自习室预订系统的设计与实现项目【项目源码+论文说明】分享

基于springboot实现自习室预订系统的设计与实现演示 摘要 在网络高速发展的时代,众多的软件被开发出来,给学生带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,学院只能以学生为导向,所以自习…

软件工程师都应该知道的10个定律

一、海勒姆法则 内容 当一个 API 有足够多的用户,你在契约中承诺了什么并不重要:系统中所有看得见的行为都会有某个人依赖…… 案例 现在有两个系统A和B,B的一个接口返回一个列表。A系统的开发人员发现返回的列表都是按照ID正向排序的。本…

SSH版本信息可被获取

漏洞描述 Name SSH版本信息可被获取 Description SSH服务允许远程攻击者获得ssh的具体信息,如版本号等等。这可能为攻击者发动进一步攻击提供帮助。 CVE No. CVE-1999-0634 分析结果 该问题不属于漏洞,不存在安全风险。SSH协议是一种安全协议&am…

基于Springboot实现幼儿园管理系统项目【项目源码+论文说明】

基于Springboot实现幼儿园管理系统演示 摘要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于幼儿园管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了幼儿园管…

【PickerView案例13-应用程序对象介绍 Objective-C语言】

一、应用程序对象介绍: 1.应用程序对象介绍: 应用程序介绍: 应用程序介绍: 应用程序介绍: 应用程序启动,本身这一过程,不是应用程序启动就完事儿了, 它有一些比较细节的东西,比如说: 1)info.plist以及pch文件 2)UIApplication对象 这个呢,我们都是分开的去说,…

C语言进阶文件操作

本章重点 1. 为什么使用文件 2. 什么是文件 3. 文件的打开和关闭 4. 文件的顺序读写 5. 文件的随机读写 6. 文本文件和二进制文件 7. 文件读取结束的判定 8. 文件缓冲区 目录 1. 为什么使用文件 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 文…

分布式软件架构——服务端缓存的三种属性

服务端缓存 在透明多级分流系统中,我们以流量从客户端中发出开始,以流量到达服务器集群中真正处理业务的节点结束。一起探索了在这个过程中与业务无关的一些通用组件,包括DNS、CDN、客户端缓存,等等。 实际上,服务端缓…

Docker搭建Redis cluster集群

redis常用的三种集群方式是:主从复制,sentinel 哨兵模式,cluster模式,本节我想详细记录下cluster集群的动手部署方式。cluster是比较主流的方式,优缺点可以百度查下。 Redis-Cluster采用无中心结构,每个节…

Hadoop启动缺失ResourceManager

Hadoop启动缺失ResourceManager 查日志是resourcemanager空指针,java.lang.NullPointerException 1、进入根目录的tmp文件夹 cd /tmp2、删除hadoop-yarn-root rm -rf hadoop-yarn-root3、重启hadoop就好啦!!!!&…

三网运营商大数据精准营销客源信息提取的原理是什么?

现在的这个互联网时代,越来越多的人从事运营商大数据这个行业,相信大家都很好奇运营商大数据的绝对优势究竟是什么,它究竟是有什么魅力,能够让那么多的人为它所倾倒,下面我们就来看一下它究竟有什么优势吧。 1.对用户的…

解析硬件连通性测试的重要性及测试方法

在现代科技世界中,硬件设备的复杂性和多样性已经达到了前所未有的水平。无论是计算机、智能手机、物联网设备还是嵌入式系统,各种硬件组件的协同工作对于设备的正常运行至关重要。硬件连通性测试是确保这些组件相互配合无误的重要步骤。 一、硬件连通性测…

[nltk_data] Error loading stopwords: <urlopen error [WinError 10054]

报错提示&#xff1a; >>> import nltk >>> nltk.download(stopwords) 按照提示执行后 [nltk_data] Error loading stopwords: <urlopen error [WinError 10054] 找到路径C:\\Users\\EDY\\nltk_data&#xff0c;如果没有nltk_data文件夹&#xff0c;在…

嵌入式养成计划-30-网络编程----多点通信--单播--广播--组播

六十六、多点通信 66.1 网络属性相关函数 getsockoptsetsockopt 功能&#xff1a;获取/设置网络属性; 原型&#xff1a;#include <sys/types.h> /* See NOTES */#include <sys/socket.h>int getsockopt(int sockfd, int level, int optname, void *opt…

12大自媒体推广平台整理

1、百家号&#xff1a;权重很高&#xff0c;百度端排名效果极好&#xff0c;即便是行业核心词&#xff0c;也可以轻松进入前三页。 2、头条号&#xff1a;即时展示效果较好&#xff0c;文章质量越高&#xff0c;被推送的范围越广。 3、微信公众号&#xff1a;更适合做私域流量…