一份很有意思的 GC log
這是 HBase 的 GC log。
遺憾由於沒有加 -XX:+PrintHeapAtGC 引數,日誌只有這些。
暴露的問題:
YGC 時間久,需要 3 至 5 秒,與出現問題之前的 20ms 有很大差距。
JVM 配置如下:
堆大小 30G。
年輕代 3G,SurvivorRatio = 2,E 和 S 的大小分別為 1.5G 和 0.75G。
從日誌中可以推斷出,應該是 survivor 區空間少,導致存活物件超出 Desired survivor size = 0.75G * 50% = 402653184b,晉升閾值調整為 1,物件過早進入老年代導致。
圖中第一次 YGC 的時間為 20ms,比較正常。加了 PrintTenuringDistribution 引數,看到物件分佈。
從很多文章中寫到,PrintTenuringDistribution 列印的是 survivor 區的物件分佈。
但日誌中看到 812976448 total,約等於 775M,大於 survivor 區的 768M。
所以我將這個統計理解成希望進入 survivor to 區的物件分佈?
第一次正常 YGC 時,單是年齡為 1 的物件就超過了 survivor 區的大小。
所以 YGC 之後,survivor 區被年齡為 1 的物件填滿,並且由於 survivor 區的佔比超過了 50%,晉升閾值被調整為 1。在之後的 YGC 中,非新分配物件直接晉升到老年代。
在之後的 YGC 中,可以看到,每次 GC 之後,年輕代佔用的記憶體均為 786432K = 0.75G,恰好為一個 survivor 區的大小。
認為之後新分配的存活物件在 YGC 後,佔滿了 survivor to 區。
但如果將 PrintTenuringDistribution 分佈理解成期望進入 survivor 區的物件分佈。
但是第一次異常 YGC 發生時,物件總數只用 773677304b 約等於 738M,不足以填滿 survivor 區的 768M。
很是疑惑,求指點。
相關文章
- 一個很有意思的選擇表情DialogActivity
- 一個很有意思的hook庫:react-hangerHookReact
- github 主頁可以 DIY 了,很有意思Github
- Java堆外快取(一個很有意思的應用)Java快取
- 有哪些鮮為人知,但是很有意思的網站?網站
- 介紹幾篇很有意思的計算機科普文章計算機
- 一個很有意思的Python小案例,真的是城市套路深呀Python
- 看到演算法問題很有意思,這邊用最笨方法解!演算法
- python的GCPythonGC
- Full GC (Metadata GC Threshold)GC
- Linux中log檔案是什麼意思?Linux日誌檔案說明Linux
- 很有用的 GCC 命令列選項GC命令列
- 從CLR GC到CoreCLR GCGC
- 沒有發生GC也進入了安全點?這段關於安全點的JVM原始碼有點意思!GCJVM原始碼
- GCGC
- MySQL的Redo log 以及Bin logMySql
- 不常用卻很有妙用的事件及方法事件
- 一道很有趣的拓撲題
- GC.MaxGeneration屬性【GC示例】GC
- JVM的GC日誌JVMGC
- MySQL中的redo log和undo logMySql
- MySQL的general_log和slow_logMySql
- GC是什麼?為什麼要有GC?GC
- JVM 系列文章之 Full GC 和 Minor GCJVMGC
- Go GC 機制的大坑GoGC
- 聊一聊 JVM 的 GCJVMGC
- 人臉識別幾個很有用的連結
- 一個非常老但是很有用的功能-閃回
- 15個很有趣的開源專案推薦
- 總結Minor GC、Full GC觸發條件GC
- java GC CollectorJavaGC
- gc buffer busyGC
- gc 檢視GC
- undo log和redo log
- .Net Core 中GC的工作原理GC
- GO的GC辣雞回收(一)GoGC
- .Net平臺的GC垃圾回收GC
- 使用Log4Net根據log level的不同將log輸出到不同的檔案中