jdk 9 compact strings通过byte[]+coder字段实现动态编码:纯latin-1字符用1字节/字符存储,含宽字符时升格utf-16,使纯ascii字符串内存减半,整体堆内存平均节省25%~30%。

Java中JDK 9引入的Compact Strings(紧凑字符串)机制,核心贡献是显著降低字符串在堆内存中的占用,实测平均节省25%~30%,在高字符串密度场景(如微服务、日志系统、JSON解析)中效果尤为突出。
为什么能省下这么多内存
关键在于底层存储从固定char[]改为动态byte[] + coder结构:
- JDK 8及之前:每个
char强制占2字节(UTF-16),哪怕字符串是"abc",也要用6字节存内容 - JDK 9+:自动判断内容——纯Latin-1字符(ASCII及ISO-8859-1,码点≤255)时,用1字节/字符存入
byte[],再加1字节coder字段;含中文、emoji等宽字符时,才升格为2字节/字符的UTF-16编码 - 例如
"Hello":JDK 8占10字节(仅数据),JDK 9+仅6字节(5字节+1字节coder)
节省效果有数据支撑
Oracle实测发现,典型Java应用中80–90%的字符串只含Latin-1字符。这意味着:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 纯ASCII字符串内存直降约50%
- 整体字符串堆内存平均减少25%~30%
- GC压力下降,尤其在字符串密集型服务中,堆大小可降至JDK 8同应用的75%左右
这不是可选功能,而是默认生效的底层优化
Compact Strings在JDK 9+中硬编码启用,没有开关参数:
-
-XX:-CompactStrings在JDK 9已移除,加了会报错“Unrecognized VM option” -
String.COMPACT_STRINGS只是static final boolean常量,值恒为true,仅用于调试确认 - 开发者无需改代码、不需调用任何API,只要运行在JDK 9及以上,优化就自动发生
哪些操作可能让节省失效
不是所有字符串都能享受1字节优势,以下情况会触发保守升格为UTF-16:
- 字符串拼接中混入宽字符:
"abc" + "你好"→ 整个结果用UTF-16 - 使用
new String(char[])或new String(byte[], String charset)构造,JVM无法静态判定内容,直接升格 -
StringBuilder.append()后toString(),若中间追加过中文等,结果必为UTF-16
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










