前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊G1 GC的String Deduplication

聊聊G1 GC的String Deduplication

原创
作者头像
code4it
发布2019-04-09 22:47:04
1.6K0
发布2019-04-09 22:47:04
举报
文章被收录于专栏:码匠的流水账

本文主要研究一下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[]就可以被回收

实例

实验代码

代码语言:javascript
复制
    @Test
    public void testG1StringDeduplication() throws InterruptedException {
        List<String> 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

代码语言:javascript
复制
-XX:+UseG1GC -XX:-UseStringDeduplication

输出如下:

代码语言:javascript
复制
string list size in MB:586.8727111816406
used heap size in MB:831.772346496582
used non heap size in MB:6.448394775390625
  • 整个jvm heap占用了约831MB,其中string list占用了约586MB

开启StringDeduplication

代码语言:javascript
复制
-XX:+UseG1GC -XX:+UseStringDeduplication

输出如下:

代码语言:javascript
复制
string list size in MB:296.83294677734375
used heap size in MB:645.0970153808594
used 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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • -XX:+UseStringDeduplication
  • 实例
    • 实验代码
      • 关闭StringDeduplication
        • 开启StringDeduplication
        • 小结
        • doc
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档