写点什么

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:295380
用户头像

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

关注

评论

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

183天打造行业新标杆!BOE(京东方)国内首条第8.6代AMOLED生产线提前全面封顶

爱极客侠

节省60%资源,替换Cassandra,北京城建智控牵手IoTDB为地铁运行保驾护航

Apache IoTDB

软硬件“双管齐下”,英特尔与百度加速推动AI无处不在

E科讯

怎样免费使用API将文字转换为拼音

幂简集成

API

核心网云原生获评中国国际信息通信展览会ICT中国(2024年度)一等奖(卓越案例奖)

极客天地

即梦AI接入豆包·视频生成模型,打造更高质量智能化创作体验

新消费日报

中小企业高效协作“神器”!华为云会议Flexus版828超值优惠

轶天下事

睿呈时代基于华为云Astro发布“数字孪生平台+政企智慧应用”全方案

平平无奇爱好科技

首批通过!华为云CodeArts Snap智能开发助手通过可信AI智能编码工具评估,获当前最高等级

平平无奇爱好科技

国庆出游全攻略:一起来“遇见心动目的地”!

最新动态

火山引擎成功举办首届AI创造者大赛,打造智能体推动汽车行业模型能力应用

新消费日报

云数据库RDS MySQL性能测试与对比@2024年09月

NineData

性能测试 云数据库 对比 RDS MySQL

分布式缓存服务Redis®版9月企业版、灵活的购买方式全新上市

平平无奇爱好科技

豆包大模型发布视频生成模型,语义理解精准、画质高保真

新消费日报

动态精选|华为云全域Serverless 8月更新盘点

平平无奇爱好科技

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