当前位置: 首页 > news >正文

聊聊G1 GC的String Deduplication

为什么80%的码农都做不了架构师?>>>   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<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

-XX:+UseG1GC -XX:-UseStringDeduplication

输出如下:

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

-XX:+UseG1GC -XX:+UseStringDeduplication

输出如下:

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

  • Java 8 String deduplication vs. String.intern()
  • JEP 192: String Deduplication in G1
  • String Deduplication – A new feature in Java 8 Update 20
  • Java 8 Update 20: String Deduplication
  • Duplicate Strings: How to Get Rid of Them and Save Memory
  • String deduplication feature (from Java 8 update 20)
  • G1 GC: Reducing Memory Consumption by 20%

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

相关文章:

  • 反向代理
  • 在Spring Boot程序中上传和下载文件
  • Javascript 如何生成Less和Js的Source map
  • MySQL索引底层实现原理
  • 基础篇-脚本题(2)
  • 通过 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)
  • 新建Salesforce的自定义对象和自定义字段
  • js-方法
  • LOJ#2082. 「JSOI2016」炸弹攻击 2(计算几何+双指针)
  • 旧版IDEA下载地址
  • 二叉搜索树的第K个结点
  • 系统吞吐量(TPS)、用户并发量、性能测试概念和公式
  • 6.1Python数据处理篇之pandas学习系列(一)认识pandas
  • class-3   linux文件系统知识(一)
  • node学习记录(1)
  • angular组件开发
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • Fundebug计费标准解释:事件数是如何定义的?
  • Javascript弹出层-初探
  • PermissionScope Swift4 兼容问题
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 优化 Vue 项目编译文件大小
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • ![CDATA[ ]] 是什么东东
  • #QT(TCP网络编程-服务端)
  • (52)只出现一次的数字III
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (solr系列:一)使用tomcat部署solr服务
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (黑马C++)L06 重载与继承
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)详解PHP处理密码的几种方式
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET的数据绑定
  • .NET上SQLite的连接
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • [20171102]视图v$session中process字段含义
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [Apio2012]dispatching 左偏树
  • [C/C++]关于C++11中的std::move和std::forward
  • [ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总
  • [GYCTF2020]Ez_Express
  • [HNOI2015]实验比较
  • [JDK工具-2] javap 类文件解析工具-帮助理解class文件,了解Java编译器机制
  • [LeetCode] Binary Tree Preorder Traversal 二叉树的先序遍历
  • [leetcode]114. Flatten Binary Tree to Linked List由二叉树构建链表
  • [lintcode easy]Maximum Subarray
  • [NOI 2016]循环之美
  • [P7885][Android13] 解决5G信号良好状态栏信号只有两格的问题
  • [PAT练级笔记] 34 Basic Level 1034 有理数四则运算
  • [PHP源码阅读]empty和isset函数