写点什么

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

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

关注

评论

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

AfterShip 举办首届 Hack-day 论坛,用技术助力业务增长,赋能研发提效

科技热闻

畅捷通的 Serverless 探索实践之路

阿里巴巴云原生

阿里云 Serverless 云原生

主编夜话,2023 技术圈儿大事件盘点丨 RTE 开发者日报 Vol.115

声网

推特(Twitter)蓝V,怎么升级蓝V

跨境

twitter VISA

元数据中心的数据有哪些分类?

如水

元数据

钉钉集成金蝶云星辰丨聚道云助力企业实现财务流程自动化

聚道云软件连接器

案例分享

2023:突破迷雾,追寻不惑之旅

BY林子

PTS 3.0:可观测加持的下一代性能测试服务

阿里巴巴云原生

阿里云 云原生 性能压测

喜讯!MIAOYUN正式获封“专精特新”中小企业称号!

MIAOYUN

四川省创新型中小企业 专精特新 MIAOYUN 专精特新中小企业 成都高新梯度培育企业

聚道云软件连接器助力企业微信与U9无缝对接,审批通知考勤一网打尽

聚道云软件连接器

案例分享

支付宝 v3 验签如何实现

盐焗代码虾

Java 支付宝 验签

联邦云高效的云计算解决方案

如水

联邦云 多云多活

仪表盘、数据分析新增分享功能及应用服务下新增服务实例菜单

博睿数据

Databend 部署与运维概要:本地部署 Meta 服务并利用 Kubernetes 管理 Query 服务

Databend

京东方董事长署名文章:新元肇启:敬征程,致未来!

科技热闻

什么是仿真软件?推荐几个简单易上手的几款CAE软件!

智造软件

CAE 仿真软件 仿真技术 CAE软件

荣耀Magic6系列旗舰新品及MagicOS 8.0发布会

荣耀开发者服务平台

安全 UX 交互 人机协作 loT

干货满满!学习有限元分析软件Abaqus的几个必备理论

思茂信息

abaqus abaqus软件 abaqus有限元仿真 有限元分析

python3中,//、/ 的区别

GoodTime

Python 水仙花数 // /

怎么在GridView中限制显示字数

GoodTime

C# asp.net GridView

市场上常见的5种LED异形屏

Dylan

设计 场景 LED LED显示屏

云原生应用开发模式的一个构想

Jade@pluto-lang

Serverless Faas 云原生(Cloud Native) aws lambda Pluto

重磅发布|博睿数据2023年度精选案例集—— IT运维之光

博睿数据

可观测性

天谋科技荣获 2023 OpenCloudOS 社区年度优秀贡献企业 | 企业深度参与开源又添认可

Apache IoTDB

TDengine 2023 年成绩单“曝光”,六大维度彰显卓越成就

TDengine

tdengine 时序数据库

爬虫业务中,为什么使用高匿代理ip仍然会被识别出来呢?

巨量HTTP

数据采集 代理IP http代理

E往无前|腾讯云大数据ES索引原理剖析及写入性能优化最佳实践

腾讯云大数据

ES

联邦云,一站式多云多活平台!

如水

联邦云 多云多活

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