G1 GC:一个神奇的 JVM 参数,减少你的内存消耗

点击上方蓝色字体,选择“设为星标”

优质文章,及时送达

现代 Java 应用程序有大量的字符串操作,例如,Web 服务 API 调用(JSON、REST、SOAP 等)、外部数据源调用(SQL、从 DB 返回的数据等)以及文本解析和文本创建等。因此,字符串对象很容易就占据了约至少 30% 的内存。然而,这些 String 对象中的大多数都是重复的,这些字符串的重复浪费了大量内存。因此,优化重复字符串对象浪费的内存是 Java 非常受欢迎的功能之一。在 G1 中,Java 就对此功能做了支持。

G1 做了什么?

G1 GC 算法运行时,它将从内存中删除垃圾对象。它还从内存中删除重复的字符串对象(字符串重复数据删除)。可以通过设置以下 JVM 参数来激活此功能:

-XX:+UseG1GC -XX:+UseStringDeduplication

注意1:为了使用此功能, 需要在 Java 8 update 20 或更高版本上运行。

注意2:为了使用 -XX:+UseStringDeduplication,您需要使用 G1 GC 算法。

让我们看一个例子吧

选择这个简单的示例就是为了研究 JVM 如何处理重复的字符串,让我们通过这个程序来验证 Java 的这个功能吧。

public class StringDeduplicationExample {
 public static List<String>myStrings = new ArrayList<>();
 public static void main(String[] args) throws Exception {
   for (int counter = 0; counter < 200; ++counter) {
     for (int secondCounter = 0; secondCounter < 1000; ++secondCounter) {
       // Add it 1000 times.
       myStrings.add(("Hello World-" + counter));
     }
     System.out.println("Hello World-" + counter + " has been added 1000 times");
   }
 }
}

这个程序非常简单,主要就是创建字符串对象:

  • 1000 个“ Hello World-0”字符串实例

  • 1000 个“ Hello World-1”字符串实例

  • 1000 个“ Hello World-2”字符串实例

  • ...

  • ...

  • ...

  • 1000 个“ Hello World-199”字符串实例

我们使用两组不同的 JVM 参数来运行这个程序。

第一组

第一次通过设置 -XX:+UseStringDeduplication JVM 参数来运行程序。即:

-Xmx20M -XX:+UseG1GC -XX:+UseStringDeduplication

第二组

第二次,不设置 -XX:+UseStringDeduplication参数的情况下运行同一程序:

-Xmx20M -XX:+UseG1GC

在这两次运行中,我们都捕获了堆的 Dump 信息,并通过堆的 Dump 分析工具 HeapHero.io 对其进行了分析。HeapHero.io 会检测由于各种无效的编程习惯而浪费的内存量,当然也包括由于重复的字符串而浪费的内存量。

从 HeapHero.io 的 Dump 分析报告中,我们有一些有趣的发现:


第一组(配置相关参数)第二组(未配置相关参数)
总体堆使用量7.94MB15.89MB
字符串对象的总数206K206K
字符串重复而浪费的内存5.6MB13.81MB

即使运行的是相同的代码,在运行第一组(配置了 -XX:+UseStringDeduplication)中,你可以看到总体堆使用量为 7.94MB,而在运行第二组(未配置了 -XX:+UseStringDeduplication)中,则总体堆使用量为 15.89MB

即使在两次运行中都有相等数量的字符串对象(206K),由于运行第一组中重复的字符串而浪费的内存量为 5.6MB,而在运行第二组中重复的字符串而浪费的内存量为 13.81MB

由于使用了 -XX:+UseStringDeduplication参数,从应用程序中删除了大量重复字符串,从而大幅度减少内存消耗。因此,你可以利用 -XX:+UseG1GC-XX:+UseStringDeduplication来减少重复字符串导致的内存浪费,它会减少应用程序的整体内存占用。

原文:https://dzone.com/articles/easy-change-to-reduce-memory-by-20

近期热文

 

喜欢本文的朋友们,欢迎长按下图关注订阅号涤生的博客,收看更多精彩内容

fc7a43ed69de44b8677f93ef3d065bd5.jpeg

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值