本文首发与InfoQ。

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运行以下代码:

public class LotsOfStrings {

private static final LinkedList LOTS_OF_STRINGS = new LinkedList<>();

public static void main(String[] args) throws Exception {

int iteration = 0;

while (true) {

for (int i = 0; i < 100; i++) {

for (int j = 0; j < 1000; j++) {

LOTS_OF_STRINGS.add(new String("String " + j));

}

}

iteration++;

System.out.println("Survived Iteration: " + iteration);

Thread.sleep(100);

}

}

}

代码会在30次循环之后因OutOfMemoryError异常而结束运行。在使用参数 -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics开启字符串去重特性后,程序可以多运行一段时间。通过JVM的日志也可以详细了解整个去重过程的详细信息。请读者自行测试。

最后,Fabian Lange还解释了字符串去重与字符串驻留的区别,它们很相似,除了字符串驻留重用了整个的String实例,而字符串去重只是针对String的字符数组。

java字符串去重复_Java 8新特性:字符串去重相关推荐

  1. java字符串去重复_java去除重复的字符串和移除不想要的字符串

    在java开发中碰到了有些字符串是重复的,如果在进行业务处理要全部遍历太对的数据就会重复,所以在进行业务处理前进行一个去重操作. 这里由于业务需要所以先将字符串转化为string数组,使用split分 ...

  2. java字符串去重复_java去除字符串中重复、不重复、消除重复后字符

    java去除字符串中重复.不重复.消除重复后字符 import java.util.HashSet; import java.util.Set; public class Main { public ...

  3. java 流常用接口_java 8新特性5--使用集合流式API

    PS:向公众号发送关键字可以搜索文章哦! 使用集合的流式API 直接上代码了,常用api都有了,要点都在注释中 苹果类: packagejava8.stream;/***@authorqiang.xi ...

  4. java 可控异常_java异常处理,重新认识java异常,java7异常处理的新特性!

    原标题:java异常处理,重新认识java异常,java7异常处理的新特性! 在程序中,错误可能产生于程序员没有预料的各种情况,或者是超出了程序员可控范围的环境因素,如用户的坏数据.试图打开一个根本不 ...

  5. Java 9 中的9个新特性

    转载自 强悍!Java 9 中的9个新特性 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新. 这里有九个令人兴奋的新功能将与 Java 9 一起发布. Java 平台级模 ...

  6. Java番外篇2——jdk8新特性

    Java番外篇2--jdk8新特性 1.Lambda 1.1.无参无返回值 public class Test {interface Print{void print();}public static ...

  7. Java 9 中的 9 个新特性

    Java 9 中的 9 个新特性 Java 8 发布三年多之后,已经于在2017年9月21日发布了. 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它的更新. 这里有九个令人兴奋 ...

  8. 深圳Java培训学习:Java8.0新特性之Lambda表达式--【千锋】

    深圳Java培训学习:Java8.0新特性之Lambda表达式–[千锋] 前言 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.本篇文章,主要给大家介绍的是lambda表 ...

  9. 字符串去重复的几种方法

    // 字符串去重复 var str = 'assssdfasddddfaaaasdf' //1.将字符串转成数组去重后,再将所有元素拼接成字符串 // 将字符串转成数组 var arr = str.s ...

最新文章

  1. 剑指offer:面试题29. 顺时针打印矩阵
  2. 牛客网剑指offer编程实践11-20题
  3. How product extension field is involved in search scenario
  4. Java三维数组的使用
  5. caffe图像分类教程_跟我上手深度学习: 五分钟尝试第一个深度学习(Caffe)训练和图像分类(详细图文步骤)...
  6. pcap封包修改服务器数据,tcprewrite批量修改pcap数据报文
  7. 乐视 logo 换新:显示“老板造车美利坚”;雷军给米粉起名小粽子;谷歌浏览器不再隐藏完整 URL|极客头条...
  8. Microsoft .NET Framework 2.0对文件传输协议(FTP)操作(上传,下载,新建,删除,FTP间传送文件等)实现汇总1...
  9. CartoonGAN照片动漫化
  10. java聚合_Java™ 教程(聚合归纳操作)
  11. 如何判断某版本的.NET Framework是否安装
  12. Word使用中常用的快捷键
  13. MySQL技术:数据库逻辑结构单元
  14. Word 替换为空值时不管用怎么办 出现[只设格式]导致替换无效怎么办
  15. label confusion learning to enhance text classification models
  16. Vue属性书写顺序推荐:
  17. python计算活了多少天计算器_年龄计算器-实际岁数计算器-周岁计算器-虚岁计算器-生日天数计算-活了多少天计算-虚岁怎么算...
  18. Windows 11 键盘快捷键终极列表
  19. 《28岁未成年》感悟——永远不要失去自我
  20. 网络安全就业前景怎么样?好找工作吗?

热门文章

  1. Registry仓库Harbor的部署与简介
  2. LeetCode简单题之数组序号转换
  3. TensorRT Analysis Report分析报告
  4. 嵌入式Linux设备驱动程序:发现硬件配置
  5. 基于区域的CNN(R-CNN)
  6. FCN与U-Net语义分割算法
  7. 标题 相机标定(Camera calibration)原理和步骤
  8. 2021年大数据常用语言Scala(三十一):scala面向对象 特质(trait)
  9. Docker核心技术之数据管理
  10. [JavaScript] Map类型在JavaScript中的使用