写点什么

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

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

关注

评论

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

NTFS Disk by Omi NTFS for mac (NTFS 磁盘管理器)v1.1.4中文版下载

iMac小白

喜报!博睿数据荣获数据猿“年度创新服务企业奖、年度创新服务产品奖”

博睿数据

可观测性 博睿数据 运维监控

Unity3D代码混淆方案详解

雪奈椰子

供应链共舞:数字化协同推动服装企业商品计划的无缝衔接

第七在线

详解KubeEdge EdgeMesh v1.15 边缘CNI特性

华为云开发者联盟

开发 华为云 容器网络 华为云开发者联盟

克魔助手抓包教程:网络数据包分析利器

语音数据集在智能语音搜索中的应用与挑战

来自四九城儿

ClickHouse分析效率翻倍提升,揭秘奇点云对归因分析场景的优化实践

先锋IT

“一次不过、免费再考” 限时活动开启,快来考取亚马逊云科技认证吧!

亚马逊云科技 (Amazon Web Services)

培训与认证

数字先锋| 向“新”而生!天翼云携手中化信息按下化工行业变革加速器

天翼云开发者社区

云计算 数字化转型 云平台

OpenHarmony图形HDI基础适配及点屏

Laval小助手

每日一题:LeetCode-297. 二叉树的序列化与反序列化

Geek_4z9ami

面试 算法 LeetCode 二叉树 DFS

FlowJo 10 for Mac(流式细胞分析软件)v10.4激活版

iMac小白

原型设计软件Axure RP 9 for Mac 中文正式破解版下载

iMac小白

Microsoft Office 2019 for Mac中文正式版下载(office全家桶)

iMac小白

数字先锋| 让群众健康更有“医靠”,天翼云为喀什中医院开出“上云妙方”!

天翼云开发者社区

云计算 大数据

Sketch for mac(专业矢量绘图设计软件)v99.1中文激活版

iMac小白

JetBrains DataGrip 2023 Mac v2023.3.2中文激活版下载

iMac小白

一文了解字节跳动消息队列演进之路

字节跳动云原生计算

大数据 云原生 消息列队

微信公众号短链实时获取阅读量、点赞数爬虫方案(不会Hook可用)

不在线第一只蜗牛

爬虫 微信公众号 工具分享 hook

华为云DTSE助力无锡云数IoT系统:打造超可靠数字化之源

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 华为云DTSE

JNPF低代码平台的表单设计器

高端章鱼哥

低代码 表单设计 JNPF

Royal TSX for Mac(强大的远程管理软件)v6.0.2激活版下载

iMac小白

OpenHarmony开源GPU库Mesa3D适配说明

Laval小助手

OpenHarmony

你不知道的vue3:使用runWithContext实现在非 setup 期间使用inject

快乐非自愿限量之名

Java 前端 前端开发 Vue3

一款轻量级、基于Java语言开发的低代码开发框架,开箱即用!

互联网工科生

Java 低代码 数字化 开发框架 JNPF

一、nextjs如何使项目工程化(c-shopping电商开源)

Geek_9da61c

开源 eslint prettier husky next.js

阿里云PolarDB开发者大会首度召开,让数据库开发像“搭积木”一样简单

阿里云瑶池数据库

数据库 云计算 阿里云 云原生 开发者大会

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