10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

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

关注

评论

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

天翼云十年一诺,以普惠算力拥抱万里山河

脑极体

在线TSV转SQL工具

入门小站

工具

CMMI3级(低成熟度)与5级(高成熟度)到底有什么不同?

高山

CMMI CMMI高成熟度

一种基于事件驱动思想的 SAP 系统集成二次开发方法介绍

汪子熙

云计算 SAP 二次开发 5月月更

适合喜欢快速wiki和md的 vuepress

kcnf

奉劝想把编程学好的学弟们 · 如何高效学习编程?

安然无虞

5月月更

深入浅出PID算法

劼哥stone

算法 工业互联网 PID

keep-alive+导航守卫让缓存更精确

空城机

Vue 5月月更

Go语言入门很简单:如何在 Go 语言中使用 MySQL

宇宙之一粟

Go 语言 MySQL 数据库 5月月更

云原生×实战派:向业务聚焦,数字创新时代的最佳选择

阿里巴巴云原生

阿里云 云原生 实战 电子书 案例集

kubernetes下的Nginx加Tomcat三部曲之二:细说开发

程序员欣宸

Java Kubernetes 5月月更

浅谈前端和后端的区别

工程师日月

5月月更

sealer 成为 CNCF Sandbox 项目,旨在构建分布式应用交付新标准

阿里巴巴云原生

阿里云 开源 容器 云原生

高效学习C++基础部分&话题挑战赛

安然无虞

5月月更

ACK One 构建应用系统的两地三中心容灾方案

阿里巴巴云原生

阿里云 容器 云原生 容灾

YUV色彩空间

Loken

5月月更

【PIMF】手把手教会在OpenHarmony仓库不使git命令提交PR参与社区贡献

离北况归

OpenHarmony Openharmony啃论文俱乐部 PIMF团队

什么是数据资产?

奔向架构师

数据资产 5月月更

在线提取Sitemap中的URL工具

入门小站

工具

HTML的iframe使用

恒山其若陋兮

5月月更

这 BUG,绝了

AlwaysBeta

程序员

网站开发进阶(五十)IE浏览器JS调试方法详解

No Silver Bullet

调试 5月月更

Zadig + Gitee:完美实现微服务架构持续交付

Zadig

DevOps 云原生 CI/CD 软件交付

九、高可用之弹性伸缩

穿过生命散发芬芳

5月月更 高可用设计

整理了100个必备的Python函数,建议收藏

伤心的辣条

Python 程序人生 软件测试 软件自动化测试 测试 单元测试

八卦信息怎样传到吃瓜群众?这是一条正儿八经的技术科普

融云 RongCloud

PHP基础语法1

乌龟哥哥

5月月更

针对自动取款机优化需求的用例设计,应该挺全面了吧

伤心的辣条

Python 程序人生 软件测试 软件自动化测试 软件测试工程师

测试人面试 常被问到的计算机网络题,高薪回答模板来了!

伤心的辣条

Python 程序人生 测试 自动化测试 测试 单元测试

linux之history命令

入门小站

Linux

计算机二级备考

工程师日月

5月月更

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