写点什么

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

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

关注

评论

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

PoseiSwap:通过 RWA 的全新叙事,反哺 Nautilus Chain 生态

股市老人

IoTOS-App v0.6.0 智能诊断、用量/会话记录、批量业务办理、

开源物联卡管理平台-设备管理

物联网平台 IoT 开源软件 国产开源 物联网展

远程控制软件安全吗?一文看懂ToDesk、RayLink、TeamViewer、Splashtop相关安全机制

颜淡慕潇

安全 远程控制 远程桌面工具 ToDesk

Sprint Boot学习路线2

小万哥

Java spring Spring Cloud Spring Boot 后端

在 Amazon DocumentDB 里处理 Decimal128类型数据的解决方案

亚马逊云科技 (Amazon Web Services)

C++异步编程开源项目Workflow三岁啦 \^0^/

1412

开源项目 异步编程 异步任务编程 workflow C++

openGauss内核分析(三):SQL解析

daydayup

2023-07-31:用r、e、d三种字符,拼出一个回文子串数量等于x的字符串。 1 <= x <= 10^5。 来自百度。

福大大架构师每日一题

福大大架构师每日一题

openGauss运维能力之SQLPatch解密

daydayup

北岩律师事务所:50000余家客户的选择,全国首家专注大消费领域的精品律所

联营汇聚

大会议程正式公布 华为开发者大会看点前瞻

极客天地

平台工程动态 MonthlyNews 2023-7

杨振涛

云原生 研发效能 平台工程 开发者体验 内部开发者平台

中文多模态医学大模型智能分析X光片,实现影像诊断,完成医生问诊多轮对话

汀丶人工智能

人工智能 自然语言处理 计算机视觉 多模态大模型

Squids openGauss | 云上免费openGauss数据库服务

daydayup

数字人第一剑,先斩“尹天仇”

脑极体

AI

Apache IoTDB v1.1.1/v1.1.2 发布|增加 ZSTD 压缩,show variables 增加时间精度

Apache IoTDB

IoTDB Apache IoTDB

在Go中使用Arm的SIMD指令

geange

Go 汇编 neon arm64

【我和openGauss的故事】openGauss的WDR报告解读

daydayup

ChatPaper全流程加速科研:论文阅读+润色+优缺点分析与改进建议+审稿回复

汀丶人工智能

人工智能 自然语言处理 nlp chatpaper

【我和openGauss的故事】openGauss易知易会的几个实用特性

daydayup

祝贺!openGauss社区技术委员会主席李国良当选2023 IEEE FELLOW

daydayup

配置 Sublime Text4为 C++ 编辑器的方法

芯动大师

惊喜!1行Python代码,瞬间测你工作量,分享一个统计代码行数的神器

程序员晚枫

Python GitHub 开源项目 工作量

PoseiSwap:通过 RWA 的全新叙事,反哺 Nautilus Chain 生态

鳄鱼视界

云原生大数据平台CloudEon V1.1.0版本发布!

CloudEon开源

大数据 云原生 容器化

openGauss+Wasm:构建安全高效的UDF执行引擎

daydayup

openGauss获2022年度创新产品奖!

daydayup

openGauss内核分析(四):查询重写(二)

daydayup

DHorse v1.3.0 发布,基于k8s的发布平台

tiandizhiguai

DevOps k8s

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