大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

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

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

关注

评论

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

Prophecis 0.2.0 版本发布

WeDataSphere

机器学习 大数据 学习 WeDataSphere

Python-计算机视觉-OpenCV-Image

Aldeo

Python OpenCV 计算机视觉

【实战问题】-- 缓存穿透,缓存击穿和缓存雪崩的区别以及解决方案

秦怀杂货店

Java redis 缓存 架构 分布式

前置机器学习(一):数学符号及希腊字母

caiyongji

机器学习

MyBatis-Plus实现自动填充createTime和updateTime

棉花糖

springboot MyBatisPlus

前置机器学习(五):30分钟掌握常用Matplotlib用法

caiyongji

机器学习

Git教程 - Git 命令与操作

码界行者

git DevOps

LeetCode题解:198. 打家劫舍,动态规划(不缓存偷盗状态),JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

前置机器学习(四):一文掌握Pandas用法

caiyongji

机器学习

想当程序员,如何判断自己是否适合当前端程序员?

孙叫兽

程序员 大前端 引航计划

初来乍到,请多关照

空城机

杂记

爬虫入门经典(十二) | 一文带你快速爬取豆瓣电影

不温卜火

python 爬虫

源码分析Netty:核心组件及启动过程分析

程序员架构进阶

架构 Netty 源码剖析 28天写作 3月日更

助力香港成为全球寿命最长的城市,我们如何看医管局的数字化转型?

有只小耳朵

数字化转型 人才培养

Three.js杂记(二)——绘制点、线、面

空城机

JavaScript 大前端 WebGL 3D可视化 three.js

爬虫入门经典(四) | 如何爬取豆瓣电影Top250

不温卜火

python 爬虫

前置机器学习(三):30分钟掌握常用NumPy用法

caiyongji

机器学习

如何利用VGG19实现insightface人脸识别?

程序媛观澜

机器学习 人脸识别

波卡生态DeFi系统开发方案

薇電13242772558

区块链 defi

Three.Js杂记(一)——起步

空城机

大前端 WebGL 3D可视化 three.js

Three.js杂记(三)—— 物体运动

空城机

JavaScript 大前端 WebGL 3D可视化 three.js

爬虫入门经典(七) | 一文带你爬取淘宝电场

不温卜火

python 爬虫

前置机器学习(二):30分钟掌握常用Jupyter Notebook用法

caiyongji

机器学习

2.4 Go语言从入门到精通:条件和循环

xcbeyond

3月日更 Go 语言

如何巧妙的去除数组中的空格?

程序媛观澜

c++ 字符串

它终于来了!

Python研究所

Python

新思科技BlackDuck帮助Avira软件公司在保持DevOps速度的同时提升开源安全

InfoQ_434670063458

爬虫入门经典(十五) | 邪恶想法之爬取百度妹子图

不温卜火

python 爬虫

一文看懂特权访问管理(PAM)

龙归科技

云计算 云存储

大前端工程师进阶之路,Node全栈为前端带来更多可能

孙叫兽

大前端 全栈 Node

爬虫入门经典(十八) | 滑动验证码识别

不温卜火

python 爬虫

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