AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

Java 8 新特性:字符串去重

  • 2014-09-11
  • 本文字数:1157 字

    阅读完需:约 4 分钟

8 月 19 日,Oracle发布了JDK 8u20 ,JDK 8u20 包含很多新特性,比如Java 编译器更新、支持在运行时通过API 来修改MinHeapFreeRatio 和MaxHeapFreeRatio 参数、新的GC 调优指南文档。不过在众多新特性中,最令人期待的还是字符串去重(String Deduplication )特性。如何减少内存占用一直是一个永恒的话题,而在Java 应用中,经常会看到String 对象会占用应用30% 的内存,它是Java 中最常用的对象之一。新的字符串去重特性可以帮助减少应用中String 对象的内存占用,目前该特性只适用于G1 垃圾收集器,并且默认不被开启。

Fabian Lange 解释了字符串去重特性的实现方式:

垃圾收集器会在访问 String 对象时对其字符数组进行标记,并将 String 的哈希值以及弱引用保存到一个数组中。当垃圾收集器发现另一个具有相同哈希值的 String 对象时,它就会逐字符比对这两个对象。如果他们完全匹配,那其中一个 String 就会被修改指向到另一个 String 的字符数组。由于第一个字符数组已经不再被引用,所以它也就可以被回收了。垃圾收集器会尽量减少整个操作的开销,比如某个 String 对象扫描未发现有重复,那接下来的一段时间内它不会再被检查。

紧接着,Fabian Lange 通过代码的方式解释了字符串去重特性的神奇效果。首先使用 Java 8 Update 20 通过参数 -Xmx256m -XX:+UseG1GC 运行以下代码:

复制代码
<span>public</span> <span>class</span> LotsOfStrings {
<span>private</span> <span>static</span> final LinkedList<String> LOTS_OF_STRINGS = <span>new</span> LinkedList<>();
<span>public</span> <span>static</span> <span>void</span> <span>main</span>(String[] args) throws Exception {
<span>int</span> iteration = <span>0</span>;
<span>while</span> (<span>true</span>) {
<span>for</span> (<span>int</span> i = <span>0</span>; i < <span>100</span>; i++) {
<span>for</span> (<span>int</span> j = <span>0</span>; j < <span>1000</span>; j++) {
LOTS_OF_STRINGS.add(<span>new</span> String(<span>"String "</span> + j));
}
}
iteration++;
System.<span>out</span>.println(<span>"Survived Iteration: "</span> + iteration);
Thread.sleep(<span>100</span>);
}
}
}

代码会在 30 次循环之后因 OutOfMemoryError 异常而结束运行。在使用参数 -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics 开启字符串去重特性后,程序可以多运行一段时间。通过 JVM 的日志也可以详细了解整个去重过程的详细信息。请读者自行测试。

最后,Fabian Lange 还解释了字符串去重与字符串驻留的区别,它们很相似,除了字符串驻留重用了整个的 String 实例,而字符串去重只是针对 String 的字符数组。

2014-09-11 07:295193
用户头像

发布了 219 篇内容, 共 146.7 次阅读, 收获喜欢 195 次。

关注

评论

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

探索鸿蒙原生应用开发:借助 FinClip 跨端技术之旅

xuyinyin

DeepSeek本地化部署超简单,比装个office还简单

伤感汤姆布利柏

天润融通已接入DeepSeek,大模型赋能客户服务,效率与体验双提升

天润融通

人工智能 DeepSeek

碳课堂|生物质能如何成为减排利器

AMT企源

能源 碳管理 节能减排

macOS Sequoia 15.3.1 (24D70) Boot ISO 原版可引导镜像下载

sysin

sequoia

无问芯穹上架满血DeepSeek-R1国产适配,叠加Cursor开发效率飞升,附教程链接

科技热闻

麦杰魔盒上新了,鸿蒙版边缘智能终端HM-5000正式首发!

麦杰研究院

从0到1构建 Kubernetes中间件运维平台:标准化、可视化与全栈运维的最佳实践|得物技术

得物技术

运维 后端

接入5家DeepSeek模型提供商!火山引擎边缘大模型网关助力一键畅享大模型

火山引擎边缘云

边缘计算 LLM #大模型 边缘智能 DeepSeek

DeepSeek本地化部署超简单,比装个office还简单

不在线第一只蜗牛

人工智能 DeepSeek

Ai.com指向DeepSeek:中国AI强势崛起,却遭遇2000多仿冒域名阻击

国科云

Zerto 10.0 Update 5 - 适用于本地、混合和多云环境的灾难恢复和数据保护

sysin

Zerto

系统稳定性的基石:限流在 AutoMQ 中的最佳实践

AutoMQ

云计算 大数据 云原生 后端 限流

AutoMQ 如何实现没有写性能劣化的极致冷读效率

AutoMQ

云计算 大数据 后端 压测 流量

KubeEdge春季带薪远程实习来了!2025年LFX Mentorship开启申请

华为云原生团队

云计算 容器 云原生

在CAD中插入图块后为什么看不到?怎么解决?

在路上

cad cad看图 CAD看图王

从报表小白一秒升级为高手,Univer Go 这款免费的报表设计器模版有多厉害?

梦数技术团队

Python 数据库 Excel DeepSeek

macOS Sonoma 14.7.4 (23H420) Boot ISO 原版可引导镜像下载

sysin

Sonoma

CAD使用教程:怎么在手机上插入CAD图块?

在路上

cad cad看图 CAD看图软件

人工智能丨Deepseek vs 传统测试工具:谁将主导软件质量保障?

测试人

人工智能

富士胶片集团发布2024财年第三季度财务报告

财见

一个很有意思的面试失败案例

老张

面试经验 面试求职 职场认知

征程 6 相比征程 5 对算子支持扩展的具体案例讲解

地平线开发者

自动驾驶 算法工具链 地平线征程6

Java 8新特性:字符串去重_Java_小盖_InfoQ精选文章