您现在的位置是:亿华云 > IT科技
JDK9对String字符串的新一轮优化,不可不知
亿华云2025-10-08 23:21:00【IT科技】4人已围观
简介本文转载自微信公众号「程序新视界」,作者二师兄。转载本文请联系程序新视界公众号。String类可以说是Java编程中使用最多的类了,如果能对String字符串的性能进行优化,那么程序的性能必然能大幅提
本文转载自微信公众号「程序新视界」,不可不知作者二师兄。字符转载本文请联系程序新视界公众号。新轮
String类可以说是优化Java编程中使用最多的类了,如果能对String字符串的不可不知性能进行优化,那么程序的字符性能必然能大幅提升。
这不JDK9就对String字符串进行了改进升级,新轮在某些场景下可以让String字符串内存减少一半,优化进而减少JVM的不可不知GC次数。
String的字符底层存储
在面试的时候我们通常会说String字符串有不可变的特性,每次都要创建新的新轮字符串。那么,优化为什么String字符串是不可不知不可变的呢?
先来看一下String字符串的底层存储结构:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { private final char value[]; public String() { this.value = "".value; } public String(String original) { this.value = original.value; this.hash = original.hash; } // ... }看到什么了?当我们new一个String对象时,对应的字符字符串其实是以char数组的形式存储在String对象内部。而这个char数组是新轮final的,也就是说不可变的服务器托管。
这也就是为什么我们说String字符串拥有不可变的特性,当字符串改变了,char数组不可变,就只能创建一个新的对象,新的char数组了。
底层存储的优化
上面说的情况是JDK8及以前版本,到了JDK9,String中字符串的存储不再用char数组了,改用byte数组。
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { @Stable private final byte[] value; private final byte coder; @Native static final byte LATIN1 = 0; @Native static final byte UTF16 = 1; static final boolean COMPACT_STRINGS; public String() { this.value = "".value; this.coder = "".coder; } @HotSpotIntrinsicCandidate public String(String original) { this.value = original.value; this.coder = original.coder; this.hash = original.hash; } // ... }不仅将char数组改为byte数组,而且新增了一个coder的成员变量。
在程序中,绝大多数字符串只包含英文字母数字等字符,使用Latin-1编码,一个字符占用一个byte。如果使用char,一个char要占用两个byte,会占用双倍的内存空间。
但是,如果字符串中使用了中文等超出Latin-1表示范围的字符,亿华云使用Latin-1就没办法表示了。这时JDK会使用UTF-16编码,那么占用的空间和旧版(使用char[])是一样的。
coder变量代表编码的格式,目前String支持两种编码格式Latin-1和UTF-16。Latin-1需要用一个字节来存储,而UTF-16需要使用2个字节或者4个字节来存储。
据说这一改进方案是JDK的开发人员用大数据和人工能智能,调研了成千上万的应用程序的heapdump信息后,得出:大部分的String都是以Latin-1字符编码来表示的,只需要一个字节存储就够了,两个字节完全是浪费。
COMPACT_STRINGS属性则是用来控制是否开启String的compact功能。默认情况下是开启的。可以使用-XX:-CompactStrings参数来对此功能进行关闭。
改进的源码库好处
改进的好处是非常明显的,首先如果项目中使用Latin-1字符集居多,内存的占用大幅度减少,同样的硬件配置可以支撑更多的业务。
当内存减少之后,进一步导致减少GC次数,进而减少Stop-The-World的频次,同样会提升系统的性能。
小结
随着JDK的迭代String字符串的内存结构及方法等也在不断地进行演变。这是因为String字符串往往是JVM中占用内存最多的类,通过对它的改造升级,对性能的提升会更加明显。
很赞哦!(441)
相关文章
- 其次,一般域名注册有一个获取密码的按钮,域名注册商点击后会向您发送密码。在得到域名注册商发送的密码后,将其传输到域名服务提供商网站,然后输入密码,此时域名呈现申请状态。提交申请后,原注册人通常会向您发送一封电子邮件,询问您是否同意转让。此时,您只需点击同意转移按钮,域名注册商就可以成功转移。
- Host容器:Tomcat如何实现热部署和热加载?
- NetBox介绍和自动化管理配置
- 确保2024年数据中心可靠性和正常运行时间的主要策略
- 域名和网址一样吗?域名和网址有什么区别?
- 什么是OSI模型第四层?
- 探访光子1号金融算力中心,北京最近的万座机架规模智算中心
- 如何改造数据中心实现可持续发展
- 以上的就是为大家介绍的关于域名的详解域名注册:域名注册0
- 如何减少数据中心内的服务器噪音
热门文章
站长推荐
域名资源有限,好域名更是有限,但机会随时都有,这取决于我们能否抓住机会。一般观点认为,国内域名注册太深,建议优先考虑外国注册人。外国注册人相对诚实,但价格差别很大,从几美元到几十美元不等。域名投资者应抓住机遇,尽早注册国外域名。
如何利用智能电缆密封件增强数据中心安全
AMD AI芯片被曝软件有大量bug、无法开箱即用!难成英伟达平替!曾在发布会称优于H100六成被打脸;苏妈:我们的技术栈有缺陷
降低数据中心的功耗是实现可持续数据中心的核心
尽量不要在域名中出现特殊字符,这样的域名很容易导致访问者输入错误,同时给人留下不专业的印象,降低网站的可信度,并流失大量潜在客户。
Ampere 年度展望:2025年重塑IT格局的四大关键趋势
驾驭不断变化的格局:2024 年数据中心趋势
数据中心同步计时的关键作用