0

0

什么是JVM的字符串去重特性(String Deduplication)_G1收集器的内存节约方案

P粉602998670

P粉602998670

发布时间:2026-03-15 09:09:12

|

151人浏览过

|

来源于php中文网

原创

String Deduplication 是 G1 垃圾收集器专属的运行时字符串去重机制,通过在 GC 中合并重复的 String 底层数组来节省内存,但仅对老年代中内容完全相同的 char[]/byte[] 生效,需满足 G1、显式启用及 JDK≥8u20 三条件,且效果依赖字符串重复率与生命周期。

什么是jvm的字符串去重特性(string deduplication)_g1收集器的内存节约方案

String Deduplication 是什么,它真能省内存?

它不是 JVM 的通用字符串池优化,而是 G1 垃圾收集器专属的运行时去重机制:在 GC 过程中扫描堆上重复的 String 对象(仅限底层 char[]byte[] 内容完全相同),保留一个实例,让其余对象指向它。效果取决于字符串重复率和生命周期——堆里有大量长生命周期、内容雷同的字符串(比如日志 ID、JSON 字段名、HTTP Header 值)时,内存节省才明显;如果字符串大多短命或唯一,开销反超收益。

怎么开启并确认 String Deduplication 生效?

必须同时满足三个条件才能启用:

  • 使用 G1 收集器:-XX:+UseG1GC
  • 显式启用去重:-XX:+UseStringDeduplication(默认关闭)
  • JDK 版本 ≥ 8u20(JDK 9+ 默认仍关闭,需手动加参数)

验证是否生效,看 GC 日志里的 StringDeduplication 行:

[GC pause (G1 Evacuation Pause) (young), 0.023 ms]
   [String Deduplication: 0.000 ms, 0 processed, 0 deduplicated, 0 attempted]

注意:processed 不为 0 才说明扫描已启动;deduplicated 是真正合并的数量。如果长期为 0,大概率是字符串还没活过第一个 GC 周期(去重只作用于老年代对象),或内容实际不重复。

Giiso写作机器人
Giiso写作机器人

Giiso写作机器人,让写作更简单

下载

为什么开了却没看到内存下降?常见踩坑点

去重本身不立即释放内存,它只是把多个 String 的底层数组引用指向同一份数据,原数组变成垃圾等下次 GC 回收。所以观察窗口要拉长,且得看老年代占用趋势(用 jstat -gcOU 列)。

  • 字符串太“新”:G1 只对晋升到老年代的 String 做去重,年轻代对象直接忽略
  • 用了 String.intern():它走的是 JVM 字符串常量池(PermGen / Metaspace),和 String Deduplication 完全无关,二者不协同也不冲突
  • 字符串底层是 byte[] 但编码不同:JDK 9+ 的紧凑字符串(coder 字段)要求 coder 和内容都一致才去重;Latin-1UTF-16 编码的相同文本不会被识别为重复
  • 启用了 -XX:+UseCompressedOops(默认开启)但堆 > 32GB:可能导致对象头布局变化,间接影响去重扫描效率(罕见,但高内存场景可排查)

性能代价和调优参数有哪些?

去重在 GC 暂停期间执行,会略微延长 young GC 时间(尤其老年代大、重复字符串多时)。它用哈希表维护已见数组指纹,默认最大 1M 条目,满后开始驱逐旧条目。

  • 控制哈希表大小:-XX:StringDeduplicationTableSize=1048576(默认值,不建议乱调)
  • 调整扫描频率(高级):-XX:StringDeduplicationAgeThreshold=3 表示对象至少经历 3 次 GC 后才参与去重(默认为 3,提高阈值可减少 young 区误扫)
  • 监控开销:-XX:+PrintStringDeduplicationStatistics 输出详细统计,但别在生产长期开着——日志量不小

真正关键的取舍在于:你愿不愿意为可能的内存节约,承担一点点 GC 时间波动。没有银弹,只有权衡。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1051

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1570

2023.10.24

字符串常量的表示方法
字符串常量的表示方法

字符串常量的表示方法:1、使用引号;2、转义字符;3、多行字符串;4、原始字符串;5、字符串连接;6、字符串字面量和对象;7、编码问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

145

2023.12.26

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

761

2023.08.03

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号