亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么解決G1垃圾回收器GC頻繁導致的系統波動問題

發布時間:2021-10-21 10:21:46 來源:億速云 閱讀:489 作者:柒染 欄目:大數據

怎么解決G1垃圾回收器GC頻繁導致的系統波動問題,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

CPU波動如圖所示:

怎么解決G1垃圾回收器GC頻繁導致的系統波動問題

內存波動如圖所示:

怎么解決G1垃圾回收器GC頻繁導致的系統波動問題

CPU經常達到告警閾值,觸發告警信息,第一反應就是去看下java進程里哪個線程耗CPU資源多,其實這里看到內存波動情況就大致能猜測出和GC有關。

top -Hp PID

PID      %CPU %MEM    TIME+  COMMAND           
89011      70.9 31.8 154:44.25 java              
89001       7.7 31.8 216:48.06 java              
90049       7.7 31.8  57:37.76 java

89011 轉換為十六進制 15bb3

通過jstack導出來的線程快照可以找到 15bb3 對應的線程,結果如下所示:

cat 01_jstack.txt  | grep '15bb3' --color

"Gang worker#0 (G1 Parallel Marking Threads)" os_prio=0 tid=0x00117f198005f000 nid=0x15bb3 runnable

可以看到是G1在執行GC的時候導致CPU強烈波動,和我們的猜測是吻合的。

馬上看了下GC日志,很恐怖

15:30:46.696+0800: 52753.211: [GC pause (G1 Humongous Allocation) (young) (to-space exhausted), 0.3541373 secs]
   [Parallel Time: 146.3 ms, GC Workers: 4]
      [GC Worker Start (ms): Min: 52753215.2, Avg: 52753215.2, Max: 52753215.2, Diff: 0.0]
      [Ext Root Scanning (ms): Min: 3.9, Avg: 4.2, Max: 4.7, Diff: 0.7, Sum: 16.7]
      [Update RS (ms): Min: 103.8, Avg: 104.3, Max: 104.4, Diff: 0.6, Sum: 417.1]
         [Processed Buffers: Min: 1512, Avg: 1551.5, Max: 1582, Diff: 70, Sum: 6206]
      [Scan RS (ms): Min: 1.6, Avg: 1.6, Max: 1.7, Diff: 0.1, Sum: 6.6]
      [Code Root Scanning (ms): Min: 0.0, Avg: 0.0, Max: 0.0, Diff: 0.0, Sum: 0.0]
      [Object Copy (ms): Min: 35.9, Avg: 36.1, Max: 36.2, Diff: 0.3, Sum: 144.2]
      [Termination (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.1, Sum: 0.1]
         [Termination Attempts: Min: 1, Avg: 1.0, Max: 1, Diff: 0, Sum: 4]
      [GC Worker Other (ms): Min: 0.0, Avg: 0.0, Max: 0.1, Diff: 0.0, Sum: 0.1]
      [GC Worker Total (ms): Min: 146.2, Avg: 146.2, Max: 146.2, Diff: 0.1, Sum: 584.8]
      [GC Worker End (ms): Min: 52753361.4, Avg: 52753361.4, Max: 52753361.4, Diff: 0.0]
   [Code Root Fixup: 0.3 ms]
   [Code Root Purge: 0.0 ms]
   [Clear CT: 0.2 ms]
   [Other: 207.3 ms]
      [Evacuation Failure: 199.2 ms]
      [Choose CSet: 0.0 ms]
      [Ref Proc: 1.2 ms]
      [Ref Enq: 0.1 ms]
      [Redirty Cards: 0.2 ms]
      [Humongous Register: 0.2 ms]
      [Humongous Reclaim: 1.9 ms]
      [Free CSet: 0.2 ms]
   [Eden: 644.0M(1994.0M)->0.0B(204.0M) Survivors: 10.0M->0.0B Heap: 2886.0M(4096.0M)->1675.7M(4096.0M)]
 [Times: user=1.29 sys=0.00, real=0.36 secs]

幾乎是平均5秒一次的大對象分配失敗,導致每一次GC耗時300ms以上,不僅僅導致CPU增長,也導致了STW,大量的數據積壓。

起初看到這個馬上覺得可能是內存不足導致的,偷偷的在一臺機器上做了試驗,由4G堆內存增加到6G堆內存。

 -Xmx6144m -Xms6144m

經過一天的觀察,發現CPU和內存的波動較之前沒有那么明顯,但是依然會有波動,只是拉長了波動范圍,GC的間隔時間變長了。 很顯然加這點內存這個治標不治本。

因為是是大對象分配失敗,我們的預留分配空間也是不小的,根本不可能存在分配失敗的情況,配置如下:

-XX:G1ReservePercent=25

這時候馬上想到了去看下gc時堆空間的變化情況。

jstat -gc PID 500 100

S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
 0.0   10240.0  0.0   10240.0 2232320.0 163840.0 1951744.0  1306537.7  143616.0 136650.1 16896.0 15666.3  66281 9351.321   0      0.000 9351.321
 0.0   10240.0  0.0   10240.0 2232320.0 227328.0 1951744.0  1431467.6  143616.0 136650.1 16896.0 15666.3  66282 9351.321   0      0.000 9351.321
 0.0   8192.0  0.0   8192.0 2226176.0 86016.0  1959936.0  1156258.9  143616.0 136650.1 16896.0 15666.3  66282 9351.411   0      0.000 9351.411
 0.0   8192.0  0.0   8192.0 2226176.0 151552.0 1959936.0  1228965.3  143616.0 136650.1 16896.0 15666.3  66282 9351.411   0      0.000 9351.411
 0.0   8192.0  0.0   8192.0 2226176.0 219136.0 1959936.0  1377447.6  143616.0 136650.1 16896.0 15666.3  66282 9351.411   0      0.000 9351.411
 0.0   8192.0  0.0   8192.0 2226176.0 286720.0 1959936.0  1505449.5  143616.0 136650.1 16896.0 15666.3  66282 9351.411   0      0.000 9351.411
 0.0   8192.0  0.0   8192.0 2226176.0 358400.0 1959936.0  1697964.5  143616.0 136650.1 16896.0 15666.3  66282 9351.411   0      0.000 9351.411
 0.0   8192.0  0.0   8192.0 2226176.0 415744.0 1959936.0  1863855.0  143616.0 136650.1 16896.0 15666.3  66282 9351.411   0      0.000 9351.411
 0.0   8192.0  0.0   8192.0 2160640.0 481280.0 2025472.0  2023601.4  143616.0 136650.1 16896.0 15666.3  66282 9351.411   0      0.000 9351.411
 0.0   8192.0  0.0   8192.0 2017280.0 546816.0 2168832.0  2167987.6  143616.0 136650.1 16896.0 15666.3  66282 9351.411   0      0.000 9351.411
 0.0   8192.0  0.0   8192.0 1935360.0 581632.0 2250752.0  2249908.9  143616.0 136650.1 16896.0 15666.3  66283 9351.411   0      0.000 9351.411
 0.0    0.0    0.0    0.0   221184.0 90112.0  3973120.0  1709604.2  143616.0 136650.1 16896.0 15666.3  66283 9351.727   0      0.000 9351.727
 0.0    0.0    0.0    0.0   221184.0 145408.0 3973120.0  1850918.4  143616.0 136650.1 16896.0 15666.3  66283 9351.727   0      0.000 9351.727
 0.0    0.0    0.0    0.0   221184.0 208896.0 3973120.0  1992232.5  143616.0 136650.1 16896.0 15666.3  66284 9351.727   0      0.000 9351.727
 0.0   4096.0  0.0   4096.0 217088.0 61440.0  3973120.0  1214197.0  143616.0 136650.1 16896.0 15666.3  66284 9351.797   0      0.000 9351.797
 0.0   4096.0  0.0   4096.0 217088.0 129024.0 3973120.0  1379063.5  143616.0 136650.1 16896.0 15666.3  66284 9351.797   0      0.000 9351.797
 0.0   4096.0  0.0   4096.0 217088.0 192512.0 3973120.0  1538809.9  143616.0 136650.1 16896.0 15666.3  66284 9351.797   0      0.000 9351.797
 0.0   6144.0  0.0   6144.0 2252800.0 57344.0  1935360.0  1060884.7  143616.0 136650.1 16896.0 15666.3  66285 9351.873   0      0.000 9351.873
 0.0   6144.0  0.0   6144.0 2252800.0 100352.0 1935360.0  1157142.1  143616.0 136650.1 16896.0 15666.3  66285 9351.873   0      0.000 9351.873
 0.0   6144.0  0.0   6144.0 2252800.0 182272.0 1935360.0  1335320.9  143616.0 136650.1 16896.0 15666.3  66285 9351.873   0      0.000 9351.873
 0.0   6144.0  0.0   6144.0 2252800.0 227328.0 1935360.0  1417242.1  143616.0 136650.1 16896.0 15666.3  66285 9351.873   0      0.000 9351.873
 0.0   8192.0  0.0   8192.0 2252800.0 116736.0 1933312.0  1203152.9  143616.0 136650.1 16896.0 15666.3  66286 9351.970   0      0.000 9351.970
 0.0   8192.0  0.0   8192.0 2252800.0 186368.0 1933312.0  1201107.2  143616.0 136650.1 16896.0 15666.3  66286 9351.970   0      0.000 9351.970
 0.0   8192.0  0.0   8192.0 2252800.0 256000.0 1933312.0  1346517.4  143616.0 136650.1 16896.0 15666.3  66286 9351.970   0      0.000 9351.970
 0.0   8192.0  0.0   8192.0 2252800.0 313344.0 1933312.0  1492951.6  143616.0 136650.1 16896.0 15666.3  66286 9351.970   0      0.000 9351.970
 0.0   8192.0  0.0   8192.0 2252800.0 378880.0 1933312.0  1660890.2  143616.0 136650.1 16896.0 15666.3  66286 9351.970   0      0.000 9351.970
 0.0   8192.0  0.0   8192.0 2252800.0 440320.0 1933312.0  1806300.4  143616.0 136650.1 16896.0 15666.3  66286 9351.970   0      0.000 9351.970
 0.0   8192.0  0.0   8192.0 2228224.0 499712.0 1957888.0  1956830.7  143616.0 136650.1 16896.0 15666.3  66286 9351.970   0      0.000 9351.970
 0.0   8192.0  0.0   8192.0 2095104.0 546816.0 2091008.0  2089952.7  143616.0 136650.1 16896.0 15666.3  66286 9351.970   0      0.000 9351.970
 0.0   8192.0  0.0   8192.0 1982464.0 593920.0 2203648.0  2203618.5  143616.0 136650.1 16896.0 15666.3  66287 9351.970   0      0.000 9351.970
 0.0    0.0    0.0    0.0   221184.0 75776.0  3973120.0  1607096.3  143616.0 136650.1 16896.0 15666.3  66287 9352.284   0      0.000 9352.284
 0.0    0.0    0.0    0.0   221184.0 114688.0 3973120.0  1681849.4  143616.0 136650.1 16896.0 15666.3  66287 9352.284   0      0.000 9352.284
 0.0    0.0    0.0    0.0   221184.0 200704.0 3973120.0  1896892.7  143616.0 136650.1 16896.0 15666.3  66287 9352.284   0      0.000 9352.284
 0.0   4096.0  0.0   4096.0 217088.0 63488.0  3973120.0  1134152.3  143616.0 136650.1 16896.0 15666.3  66288 9352.356   0      0.000 9352.356
 0.0   4096.0  0.0   4096.0 217088.0 116736.0 3973120.0  1279562.6  143616.0 136650.1 16896.0 15666.3  66288 9352.356   0      0.000 9352.356
 0.0   4096.0  0.0   4096.0 217088.0 180224.0 3973120.0  1407564.5  143616.0 136650.1 16896.0 15666.3  66288 9352.356   0      0.000 9352.356
 0.0   6144.0  0.0   6144.0 2244608.0 65536.0  1943552.0  1115144.2  143616.0 136650.1 16896.0 15666.3  66289 9352.454   0      0.000 9352.454
 0.0   6144.0  0.0   6144.0 2244608.0 131072.0 1943552.0  1256458.4  143616.0 136650.1 16896.0 15666.3  66289 9352.454   0      0.000 9352.454
 0.0   6144.0  0.0   6144.0 2244608.0 204800.0 1943552.0  1412108.8  143616.0 136650.1 16896.0 15666.3  66289 9352.454   0      0.000 9352.454
 0.0   8192.0  0.0   8192.0 2238464.0 77824.0  1947648.0  1108199.4  143616.0 136650.1 16896.0 15666.3  66290 9352.558   0      0.000 9352.558
 0.0   8192.0  0.0   8192.0 2238464.0 141312.0 1947648.0  1147881.6  143616.0 136650.1 16896.0 15666.3  66290 9352.558   0      0.000 9352.558
 0.0   8192.0  0.0   8192.0 2238464.0 212992.0 1947648.0  1281003.6  143616.0 136650.1 16896.0 15666.3  66290 9352.558   0      0.000 9352.558

這很明顯是老年代一直在增長,而且增加特別快,當增長到老年代分配的總大小的時候就發生了GC,一次耗時300ms左右。 能直接躍升到老年的對象,且如此之多,很明顯是對象的大小超過了 HeapRegionSize 的一半大小以上,直接被扔到了老年代區域。 對于G1來說,如果 HeapRegionSize 沒有配置,那么這個值是智能變化的。 region sizes <1MB or >32MB ,通常來說,它的值可以參考如下:

https://stackoverflow.com/questions/46786601/how-to-know-region-size-used-of-g1-garbage-collector

in general these are the region-sizes per heap-size range:

 <4GB -  1MB
 <8GB -  2MB
<16GB -  4MB
<32GB -  8MB
<64GB - 16MB
64GB+ - 32MB

For G1 GC, any object that is more than half a region size is considered a "Humongous object". Such an object is allocated directly in the old generation into "Humongous regions". These Humongous regions are a contiguous set of regions. StartsHumongous marks the start of the contiguous set and ContinuesHumongous marks the continuation of the set.

參考文獻: https://www.oracle.com/technetwork/articles/java/g1gc-1984535.html

這說明是真的一直在分配大對象,在撐死了老年代的時候引發了GC的停頓。

這時候有點尷尬,又在這個夜黑風高的晚上偷偷的問運維要了jmap的命令權限,找了一臺生產環境的機器導了N份hprof文件下來。

jmap -dump:live,format=b,file=xxx.hprof PID

服務器拉下來N個hprof文件到本地一對比分析發現了很嚇人的東西。

堆里面的 byte[] 對象占堆內存一半以上的空間,且里面一個數組的大小不多不少,正好1M。 每一個 byte[] 的大小是 1048579 的字節。

這到底是什么東西分配了這么多的 byte 數組,且一次就分配1M。

通過使用 jvisualvm 把單獨的一個 byte[] 數組的內容導成csv文件看了下,內容大致如下所示:

112, 2, 0, 67, 48, 89, 111, 76, 15, 46, 97, 107, 16, 99, 12, 101, 46, 99, 97, 12, 101, 115, 46, 105, 119, 12, 118, 46, 68, 12, 108, 97, 119, 101, 12, 66, 120, 99, 15, 90, 118, 110, 14, 70, 111, 108, 100, 17, 114, -103, 10, 11, 120, 99, 10, 97, 110... <已截斷>

看到這些字節數據,我覺得可以寫一個工具把這些數據轉換為字符,因為可以知道只要用 ASCII 表可以轉換過來看到大致的數據內容。

小工具代碼如下:

public static void main(String[] args) throws IOException {
    int i = 0;
    File file = new File("1.csv");
    String str = FileUtils.readFileToString(file, "utf-8");
    String[] list = str.split(",");
    for (String s : list) {
        byte b = Byte.valueOf(s);
        char c = (char) b;
        System.out.print(c);
        i++;
        if (i > 3000) {
            break;
        }
    }
    System.out.println("hello end");
}

抽查了幾個1M對象導出csv字節文件,執行轉換后的大致內容如下所示:

eId inFault outFault exception in out inHeader outHeader
properties0:ID-dcn-15597-1561992626862-68-335522280FFNS {"action":"xxxx","actionTm":"2019-xx-xx 02:26:29","aType":X,"code":"xxxxx","Type":x,"bId":"xxxx","bMessage":{"bOrg":1,"boxName
......

看到這里馬上就明白了這是我們的kafka消息報文的字節數組,而這一段kafka消息在我們系統的并發量能派件前三,數據量也是穩居前排。

分析這種情況應該是生產消息或者消費接受消息的時候為消息生成的字節數組,馬上找到了生產者和消費者的基礎組件的核心代碼,發現了這樣一段代碼:

baos = new ByteArrayOutputStream(point.getMaxRequestSizeBytes());
......
eData = baos.toByteArray();

這是生產者的代碼,其中 getMaxRequestSizeBytes 如果沒有配置值的話默認大小是 1048576 ,將消息放在了一個如此大的數組里面,這種對象分配直接扔到了老年代。 而這個消息又是并發量比較大,TPS是3000左右,所以導致了老年代空間使用率瞬間就上去了,分配失敗,然后GC,接著又上去,又分配失敗,接著GC。。。

問題終于水落石出了,解決方案有兩種:

  1. 設置 getMaxRequestSizeBytes 的值為 1024*256 ,減少每一個消息的數組的大小,使其不會超過 HeapRegionSize 的一半大小,這個缺陷就是需要保證消息的大小必須在 1024*256 字節以內。

  2. 調整堆內存大小為8G或以上,同時增加配置 -XX:G1HeapRegionSize=4M ,使得1M的消息數組大小小于 HeapRegionSize 的一半。

注:

HeapRegionSize 常見的大小是:

<4GB -  1MB
 <8GB -  2MB
<16GB -  4MB
<32GB -  8MB
<64GB - 16MB
64GB+ - 32MB

一般情況下使用堆內存大小/2048個Region。

看完上述內容,你們掌握怎么解決G1垃圾回收器GC頻繁導致的系統波動問題的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

gc g1
AI

富锦市| 肥乡县| 老河口市| 溧阳市| 巢湖市| 桐庐县| 金溪县| 崇明县| 周宁县| 楚雄市| 孟村| 博爱县| 渝北区| 仙居县| 蕉岭县| 湘西| 寻甸| 龙川县| 法库县| 兴城市| 舒兰市| 吕梁市| 揭东县| 大名县| 枣强县| 泰和县| 沙洋县| 夏津县| 林甸县| 墨玉县| 江油市| 合肥市| 张掖市| 叙永县| 赤峰市| 新河县| 望谟县| 凤城市| 章丘市| 宜宾市| 黄浦区|