G1 GC:一個神奇的 JVM 參數,減小你的內存消耗

現代 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 的這個功能吧。3d

這個程序很是簡單,主要就是建立字符串對象:cdn

  • 1000 個「 Hello World-0」字符串實例對象

  • 1000 個「 Hello World-1」字符串實例blog

  • 1000 個「 Hello World-2」字符串實例內存

  • ...字符串

  • ...

  • ...

1000 個「 Hello World-199」字符串實例

咱們使用兩組不一樣的 JVM 參數來運行這個程序。

第一組

第一次經過設置 -XX:+UseStringDeduplication JVM 參數來運行程序。即:

第二組

第二次,不設置 -XX:+UseStringDeduplication 參數的狀況下運行同一程序:

在這兩次運行中,咱們都捕獲了堆的 Dump 信息,並經過堆的 Dump 分析工具 HeapHero.io 對其進行了分析。HeapHero.io 會檢測因爲各類無效的編程習慣而浪費的內存量,固然也包括因爲重複的字符串而浪費的內存量。

從 HeapHero.io 的 Dump 分析報告中,咱們有一些有趣的發現:

即便在兩次運行中都有相等數量的字符串對象(206K),因爲運行第一組中重複的字符串而浪費的內存量爲 5.6MB ,而在運行第二組中重複的字符串而浪費的內存量爲 13.81MB 。

因爲使用了 -XX:+UseStringDeduplication 參數,從應用程序中刪除了大量重複字符串,從而大幅度減小內存消耗。所以,你能夠利用 -XX:+UseG1GC-XX:+UseStringDeduplication 來減小重複字符串致使的內存浪費,它會減小應用程序的總體內存佔用。

相關文章
相關標籤/搜索