写点什么

JEP 192(String Deduplication in G1)简介

  • 2014-03-25
  • 本文字数:1841 字

    阅读完需:约 6 分钟

JEP,即 JDK Enhancement Proposals,指的是为增强 JDK 而引入的一些提案,比如 Nashorn JavaScript 引擎就是在 JEP 174 中提出的。2013 年 11 月 22 日,来自 Oracle 的 Per Liden 创建了 JEP 192(String Deduplication in G1),意在增强 G1 垃圾收集器,去掉堆中重复的 String 对象,从而减少堆内存的占用。该文档近日又有更新,Per Liden 也提交了相应代码实现,目前还处于审校和讨论中。

应该注意的是该特性只针对 G1 垃圾收集器,不适用于其他收集器。

很多大规模 Java 应用都受限于内存瓶颈,测量表明,这类应用中,String 对象大概占了 Java 堆中活数据集的 25%。而这些 String 对象中,又大约有一半是重复的,这里的重复是指,对两个字符串 string1 和 string2 而言,string1.equals(string2) 为 true。存在重复的 String 对象本质上是对内存的浪费。JEP 192 打算在 G1 收集器中实现自动和连续的 String 去重操作,以避免内存浪费,进而减少总的内存占用量。

目前 String 类有两个字段:

private final char[] value;

private int hash;

使用旧版本 Java 的读者可能有点诧异,其实早期版本中的 count、offset 等实例字段已经去掉了,InfoQ 之前也曾报道过。

value 字段是特定于实现的,在 String 类之外看不到。因为 String 类不会修改该数组的内容,也不会将其用于同步,所以我们可以安全且透明地将其在多个 String 对象之间共享。也就是说我们可以将一个 String 对象的 value 指向另一个 String 对象的 value。尽管该字段是 final 的,但因为去重操作是在虚拟机内部实现的,所以这不是问题。有兴趣的读者可以查看一下 java.lang.System 类的实现,其中的

public final static InputStream in = null;

一句,就是先将 final 字段 in 设置为 null,然后在 native 代码中重新赋值的。

这里需要注意的是,实现并没有真的去掉重复的 String 对象,去掉的只是对象中的 char 数组。这样对应用才是透明的。去掉实际的 String 对象并不安全,因为应用可能将该对象用于同步等操作。这种实现不需要修改 JDK 类库或其他任何现有的 Java 代码。

Per Liden 对大量大大小小的 Java 应用进行了测量,发现了下列结果:

  • String 对象平均占活数据的 25%
  • 重复的 String 对象平均占活数据的 13.5%
  • String 的平均长度为 45 个字符

经过分析计算,通过去重、复用 char 数组,平均大概能减少 10% 的堆内存占用。

JEP 192 文档中介绍了实现思路。垃圾收集执行时会访问堆上的活对象,在访问对象时可以判断一下该对象是否可以作为字符串去重的候选。如果是,将其插入一个队列。有一个负责去重的线程在后台运行,处理该队列。使用一个哈希表来记录 String 对象使用的所有唯一的 char 数组(即 value)。在处理候选的 String 对象时,先查找哈希表,看是不是存在和当前处理对象内容相同的 char 数组。如果存在,则更新当前对象的 value 值,使其指向在哈希表中找到的 char 数组,这样垃圾收集器就可以在某个时间把当前对象原来的 char 数组回收掉了。如果不存在,则将当前对象的 char 数组插到哈希表中,供以后处理。对于哈希表中的某个 char 数组,如果引用它的所有对象都已经不可达了,即可将其移除。该哈希表会根据当前表项的数目动态调整,使用链表处理冲突。

这里有一个重要的参数:去重年龄阈值。对象的存活时间长短不一。对于存活时间很短的对象,执行去重操作其实是浪费资源。为避免这种情况,可以设置一个年龄阈值。在 String 对象的年龄等于该阈值时,才考虑对其进行去重操作,大于该阈值则是已经处理过的。该阈值应该提供一个合理的默认值,同时支持通过虚拟机选项来配置。

实际的去重操作在去重线程中完成。它会等待 String 对象引用出现在去重队列中,然后一个一个地将其从队列中去掉。在去掉时进行处理,计算字符串的哈希值,在哈希表中查找,如果可能的话执行去重操作。去重线程负责维护一些统计信息(已检查的候选对象数,去重的字符串数等),这些信息可以打印到 GC 日志中。

需要提供新的虚拟机命令行选项:

  • UseStringDeduplication (bool) ——支持字符串去重
  • PrintStringDeduplicationStatistics (bool) ——打印详细的去重统计信息
  • StringDeduplicationAgeThreshold (uintx) ——设置 String 对象的年龄阈值

文档中还对比评价了其他方案存在的一些问题,感兴趣的读者可以参考。


感谢张龙对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014-03-25 23:332910
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 151.7 次阅读, 收获喜欢 35 次。

关注

评论

发布
暂无评论
发现更多内容

智能指标AIMetrics赋能:构建一体化数据智能决策中枢

袋鼠云数栈

数据 数据治理 大数据平台 数据管理 数据库 大数据

亚马逊云科技中国峰会:数新智能CTO原攀峰详解一站式AI原生数智平台DataCyber在Amazon EKS的实践

数新网络官方账号

【清源SCA社区版】正式上线!|深度解析:从功能架构到技术实践的全维度指南

安势信息

开源 代码检测 情源SCA 清源SCA社区版

“数字创新产品课程” 8月2-3日 · CSPO认证上海线下面授周末班【和A-CSPO打包报名享特惠】

ShineScrum

产品负责人 CSPO认证 CSPO

javascript中IIFE(立即执行函数表达式)到底是咋来的?

电子尖叫食人鱼

JavaScript

数智焕新 “数质”先行 用友BIP为企业补上数据这一课

用友BIP

Spring Boot 插件化开发模式,即插即用

Geek_e3e86e

Java 编程

昇腾CANN再进化:开放创新繁荣AI生态

极客天地

Sermant指标采集功能:构建指标可观测性实践

华为云开源

开源 微服务架构 sermant

淘宝API系列:淘宝店铺所有商品API接口详解

tbapi

淘宝API 天猫API 天猫店铺所有商品接口 淘宝店铺所有商品接口

用 AI “一句话生成代码”,用创意兑换灵码潮品:技术人的夏日狂欢季来了

阿里巴巴云原生

通义灵码

链游开发:在区块链浪潮中构建虚拟世界

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 公链开发代币开发

DApp 开发:开启去中心化应用新时代

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

用 AI “一句话生成代码”,用创意兑换灵码潮品:技术人的夏日狂欢季来了

阿里云云效

AI Infra 运维实践:DeepSeek 部署运维中的软硬结合

袋鼠云数栈

数据库 大数据 运维 数据治理 数据平台

MyEMS能源管理系统后台配置-能源费率管理

开源能源管理系统

开源 能源管理

汇金资损防控体系建设及实践 | 得物技术

得物技术

人工智能

AI 应用开发(二):Blender 建模助手

北桥苏

人工智能 大模型 AI智能体 AI工作流 MCP协议

商品中心—库存分桶调配的技术文档

不在线第一只蜗牛

Java spring

用友成功中标茅台集团司库数据管理项目

用友BIP

嘉为蓝鲸IT服务管理中心ITSM解决方案:多项殊荣实力彰显,融合创新重塑IT服务管理生态

嘉为蓝鲸

AIOPS ITSM 智能运维 IT服务管理中心

公链钱包开发:打造安全便捷的数字资产管家

区块链软件开发推广运营

交易所开发 链游开发 公链开发 代币开发 链游开发公链开发

用友与柳钢再续合作新篇,共筑废钢产业数智化新标杆

用友BIP

信创国产化,可私有化部署的企业内部即时通讯聊天软件

BeeWorks

即时通讯 IM 私有化部署

可私有化部署的企业内部即时通讯聊天软件 ——BeeWorks 免费版上线

BeeWorks

即时通讯 IM 私有化部署

Java原生交易所全套开发

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

华商律所与iCourt达成战略合作,国内首家千人规模强所完成AI本地化部署

科技汇

Aliyun OSS iOS SDK 使用指南

qife122

ios 阿里云

非凸科技荣获“2025中国金融科技竞争力百强企业”

非凸科技

三角偶极子天线(上)---MIMO系统, 包络相关系数ECC和分集增益DG

思茂信息

电磁 MIMO CST Studio Suite

JEP 192(String Deduplication in G1)简介_Java_臧秀涛_InfoQ精选文章