NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论

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

秒杀系统

橘子皮嚼着不脆

真零基础Python开发web

MySQL从删库到跑路

Python django Web bottle

架构师训练营第九周课程笔记及心得

Airs

【架构师训练营第 1 期 09 周】 学习总结

Bear

极客大学架构师训练营

Java 中常见的细粒度锁实现

rookiedev

Java 多线程 细粒度锁

应届秋招生,熬夜吃透华为架构师这份‘典藏级’计算机网络+计算机操作系统,成功上岸腾讯

网络协议 编程之路 计算机知识

架构师 01 期,第九周课后作业

子文

大数据和Hadoop平台介绍

MySQL从删库到跑路

大数据 hadoop

二分法求平方根,swift面向协议编程protocol从入门到精通、《格局》吴军著读后感、John 易筋 ARTS 打卡 Week 27

John(易筋)

collection ARTS 打卡计划 格局 吴军 李嘉图定律 面向协议protocol编程

JVM垃圾回收原理,秒杀系统架构方案

garlic

极客大学架构师训练营

Week 9 作业01

Croesus

【架构师训练营】第九周作业:性能优化

MindController

秒杀系统

助推城市智慧化!正舵者携手中科院演绎区块链魅力

CECBC

区块链 人工智能

第9周作业2

Yangjing

极客大学架构师训练营

Netty源码解析 -- 对象池Recycler实现原理

binecy

Netty 对象存储 高性能

第9周作业1

Yangjing

极客大学架构师训练营

第九周作业

极客大学架构师训练营

【喜讯】Apache DolphinScheduler 荣获 “2020 年度十大开源新锐项目”

代立冬

Apache 大数据 开源 DolphinScheduler Apache DolphinScheduler

架构师训练营 1 期第 9 周:性能优化(三)- 总结

piercebn

极客大学架构师训练营

架构师训练营第二期 Week 5 作业

bigxiang

极客大学架构师训练营

架构师训练营第 9 周作业

netspecial

极客大学架构师训练营

架构师训练营第二期 Week 5 总结

bigxiang

极客大学架构师训练营

能源区块链研究|区块链与核电安全

CECBC

区块链 核电

架构师训练营 week5 课后作业

花果山

极客大学架构师训练营

Week5 作业1

Sean Chen

架构师训练营 week5 学习总结

花果山

极客大学架构师训练营

技术选型总结一

Mars

技术选型

InfoQ 写作平台的魔力

Yolanda

第五周作业

晴空万里

极客大学架构师训练营

5G+工业互联网的中国登山队,如何攀跃“产业化”山峦?

脑极体

架构师训练营第 9 周课后练习

叶纪想

极客大学架构师训练营

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