GC 為什麼要掛起使用者執行緒? 什麼愁什麼怨?
前言
JVM 系列文章的第一篇。敬請期待後續。
故障描述
某年某月某日 上午,線上發生故障,經過排查,發現某核心服務 Dubbo 介面超時。
故障根源
檢視該服務監控指標,發現該服務 FullGC 次數過於頻繁,簡直要上天了。那也難怪介面會超時了。
那麼為啥 FullGC 次數太多會造成介面超時呢?
因為 GC 停頓。 FullGC 時會產生GC停頓,也叫 stop the world。簡稱 STW ,是指在執行垃圾收集演算法時,使用者執行緒都被掛起。這也不難理解為啥 頻繁 FullGC 會引起服務超時了。
深入探究
那麼為什麼會引起頻繁FullGC 呢?
回答這個問題之前,先了解下,有哪些情況會觸發 Full GC ?
- 老年代記憶體空間不足時,會觸發 FullGC.
- 永久代/metaspace 記憶體空間不足時,也會觸發FullGC.
- 顯示呼叫 GC,System.gc().(會建議jvm GC,但是不一定會GC).
產生 FullGC 的基本原因就上面三種。
故障服務就是建立很多物件,無法回收,導致記憶體不足,然後 GC 回收不了時,就會引起頻繁 FullGC 了。
復現故障
根據記憶體不足建立物件會引起 FullGC 的原理,寫了一個 Demo ,觀察GC 情況。
程式碼如下:
程式碼很簡單,就是讓上次建立的物件可以被回收,然後繼續建立物件,然後連結到根結點,使其不會被回收。
使用啟動引數 -Xms512m -Xmx512m 設定堆記憶體大小。
啟動 Demo ,然後發起請求,觀察GC 情況。
首先,使用命令 jps -l 檢視程式ID
然後使用 jstat 命令檢視GC資訊 ():
上圖可以看到 正在不停的進行 Full GC.
上圖可以看出,老年代,以及後設資料區 記憶體空間已滿,這也是 不停 Full GC 的原因。
再看我發出的請求:
過去這麼久,依然沒有結果。
使用 jstack 命令檢視 執行緒狀態,發現 使用者執行緒已經被掛起。
不難看出,頻繁的 FullGC 已經影響到了應用的正常執行。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3705/viewspace-2824751/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- GC是什麼?為什麼要有GC?GC
- python為什麼要用執行緒Python執行緒
- 為什麼?為什麼StringBuilder是執行緒不安全的?UI執行緒
- 為什麼redis是單執行緒的以及為什麼這麼快?Redis執行緒
- 什麼是垃圾蒐集(GC)?為什麼要有GC呢?GC
- 為什麼要虛擬化,為什麼要容器,為什麼要Docker,為什麼要K8S?DockerK8S
- Netty是什麼,Netty為什麼速度這麼快,執行緒模型分析Netty執行緒模型
- 什麼是多執行緒?Python多執行緒有什麼優勢?執行緒Python
- Redis為什麼是單執行緒?為什麼有如此高的效能?Redis執行緒
- 為什麼使用者執行緒必須對映到核心執行緒?執行緒
- 執行緒池管理(1)-為什麼需要執行緒池執行緒
- redis為什麼用單執行緒不用多執行緒Redis執行緒
- GC是什麼?為什麼我們要去使用它GC
- redis是單執行緒的,為什麼這麼快Redis執行緒
- Python多執行緒是什麼意思?有什麼優勢?Python執行緒
- 多執行緒的出現是要解決什麼問題的? 本質什麼?執行緒
- Python是什麼?為什麼要掌握python?Python
- 什麼是程式(執行緒)同步執行緒
- Redis單執行緒,為什麼速度快Redis執行緒
- JDK21的虛擬執行緒是什麼?和平臺執行緒什麼關係?JDK執行緒
- 什麼仇?什麼怨?我竟然愛上大資料了!大資料
- 什麼是Python執行緒?Python執行緒如何建立?Python執行緒
- 【多執行緒與高併發】Java守護執行緒是什麼?什麼是Java的守護執行緒?執行緒Java
- 為什麼多執行緒可以利用到多核?執行緒
- 單執行緒的 Javascript 為什麼可以非同步執行緒JavaScript非同步
- 為什麼 Random.Shared 是執行緒安全的random執行緒
- Redis是單執行緒的,但Redis為什麼這麼快?Redis執行緒
- 【Java面試】什麼是守護執行緒,它有什麼特點Java面試執行緒
- 執行緒與程式之間有什麼關係?Linux執行緒與程式有什麼區別?執行緒Linux
- Python優勢是什麼?為什麼要學習?Python
- Python到底是什麼?為什麼要學Python?Python
- 為什麼要code reviewView
- 為什麼要寫作
- 什麼是執行緒安全和執行緒不安全執行緒
- 為什麼有人說 Python 多執行緒是雞肋?Python執行緒
- 執行緒join為什麼在解構函式中執行緒函式
- 為什麼 Go map 和 slice 是非執行緒安全的?Go執行緒
- 我會手動建立執行緒,為什麼讓我使用執行緒池?執行緒