博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
聊聊G1 GC的String Deduplication
阅读量:7067 次
发布时间:2019-06-28

本文共 1812 字,大约阅读时间需要 6 分钟。

  hot3.png

本文主要研究一下G1 GC的String Deduplication

-XX:+UseStringDeduplication

  • jdk8u20给G1 GC带来了String Deduplication特性来将相同的字符串指向同一份数据,来减少重复字符串的内存开销
  • 该特性默认是关闭的,可以使用-XX:+UseStringDeduplication来开启(前提是使用-XX:+UseG1GC)
  • 具体的实现大致是JVM会记录char[]的weak reference及hash value,当找到一个hash code相同的String时,就会挨个char进行比较,当所有都match,那么其中一个String就会修改指针指向另一个String的char[],这样前者的char[]就可以被回收

实例

实验代码

@Test    public void testG1StringDeduplication() throws InterruptedException {        List
data = IntStream.rangeClosed(1,10000000) .mapToObj(i -> "number is " + ( i % 2 == 0 ? "odd" : "even")) .collect(Collectors.toList()); System.gc(); long bytes = RamUsageEstimator.sizeOfAll(data); System.out.println("string list size in MB:" + bytes*1.0/1024/1024); System.out.println("used heap size in MB:" + ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed()*1.0/1024/1024); System.out.println("used non heap size in MB:" + ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage().getUsed()*1.0/1024/1024); }

关闭StringDeduplication

-XX:+UseG1GC -XX:-UseStringDeduplication

输出如下:

string list size in MB:586.8727111816406used heap size in MB:831.772346496582used non heap size in MB:6.448394775390625
  • 整个jvm heap占用了约831MB,其中string list占用了约586MB

开启StringDeduplication

-XX:+UseG1GC -XX:+UseStringDeduplication

输出如下:

string list size in MB:296.83294677734375used heap size in MB:645.0970153808594used non heap size in MB:6.376350402832031
  • 整个jvm heap占用了约645MB,其中string list占用了约296MB

小结

  • jdk8u20给G1 GC带来了String Deduplication特性来将相同的字符串指向同一份数据,来减少重复字符串的内存开销
  • 该特性默认是关闭的,可以使用-XX:+UseStringDeduplication来开启(前提是使用-XX:+UseG1GC)
  • 在有大量重复string的前提下,使用G1 GC开启String Deduplication确实能够节省一定的内存,可以节约20%左右的内存,不过这个是理想的情况,因为普通应用里头的string重复的可能不多

doc

转载于:https://my.oschina.net/go4it/blog/3034400

你可能感兴趣的文章
从理论到实践 全面理解HTTP/2
查看>>
vue2.X 解决同一路由跳转只有参数变化的情况下,组件不刷新的问题
查看>>
深度强化学习DQN(Deep Q Network)原理及例子:如何解决迷宫问题,附源码
查看>>
我是如何设计 Upload 上传组件的
查看>>
weekly 2019-02-15
查看>>
SpringBoot+jsp项目启动出现404
查看>>
Markdown写作中的图床解决方案(基于七牛云、PicGo)
查看>>
再次简单明了总结flex布局,一看就懂...
查看>>
一步步学会用docker部署应用(nodejs版)
查看>>
无root权限新建git仓库进行多人协同工作
查看>>
【跃迁之路】【687天】程序员高效学习方法论探索系列(实验阶段444-2019.1.6)...
查看>>
假装用某米赛尔号的角度看Python面向对象编程
查看>>
RGBA和OPACITY的区别&DISPLAY和VISIBILITY的区别
查看>>
膨胀的template class成员函数
查看>>
Flask之flask-mail邮件发送
查看>>
Immutable
查看>>
要提高团队代码质量,就要这么用Git进行版本控制!
查看>>
vue动态绑定图片和背景图
查看>>
nodejs最酷炫的模块——child_process - 子进程
查看>>
一键下载:将知乎专栏导出成电子书
查看>>