30

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

 4 years ago
source link: https://www.tuicool.com/articles/3MVNv2u
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

优质文章,及时送达

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

G1 做了什么?

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

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

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

让我们看一个例子吧

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

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

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

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

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

  • ...

  • ...

  • ...

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

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

第一组

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

第二组

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

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

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

第一组 (配置相关参数) 第二组 (未配置相关参数) 总体堆使用量 7.94MB 15.89MB 字符串对象的总数 206K 206K 字符串重复而浪费的内存 5.6MB 13.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

近期热文

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

aMveiqB.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK