面试官:线上环境 FGC 频繁,如何解决?
前言
這個問題應該是 Java 面試中很經常被問到的一個題目,很多人害怕這個題目。
因為大部分人可能在工作中根本遇不到 FGC 頻繁的問題,即使從網上背了點答案,心里也不踏實,因為畢竟不是自己親自接觸和解決過。
今天就和大家聊聊面試過程中遇到這個問題,該如何解答。
與面試官的心理博弈
大多數人面試會有一個情況,把面試官想的很“高大”,感覺面試官應該“上知天文下知地理”,自己只是從網上背了個答案,肯定會被看穿,從而導致心虛。
但是大部分事實是,很多面試官也一樣沒有遇到過這個問題,因為頻繁?FGC 本身就是一個很小概率的場景。即使遇到過,大部分其實都是一些很簡單的原因。所以,如果充分準備好之后,其實可以更自信一些。
面試時如何解答
下面以我自身為例,談談如果我的服務遇到線上環境 FGC 頻繁時,我們是如何解決的。
我們的流程我覺得是比較規范的,可以用來做面試答案,也可以用來實際使用。
1、明確分工
這個步驟應該是在事前就已經明確好的,類似于一個故障處理流程規范,這邊需要明確出3個主要角色:
1)總指揮
負責故障處理整體指揮的人,例如快速拉起線上/線下會議、通知到系統核心同學,對各同學工作進行分工等等。
該角色一般由主管來擔任,或者主管指定的另一個同學。
2)故障恢復小組
負責故障恢復的同學,該部分同學的任務就是讓系統以最快的速度恢復正常。
3)故障定位小組
負責故障定位的同學,該部分同學的任務就是定位出問題的根本原因。
大部分同學的回答可能會集中在故障定位中,但其實另外兩個角色也是非常重要的,在線上出現問題時,止損永遠是放在第一位,其次才是定位。
2、故障恢復
2.1、線上發布導致
查看故障服務近期是否存在上線操作,如果有的話優先采取回滾解決。
分析:該場景應該是最常見的場景,就是剛上的代碼存在bug。
2.2、非線上發布導致
1)小面積故障
如果故障機器只是發布在少量機器,例如:某機臺機器、某個機房機器、某個地域的機器、某個泳道的機器等等。
此時優先采取禁用服務器解決,禁用前先評估禁用這批機器后是否存在服務容量問題,如果是則先擴容。
分析:該場景一般是代碼存在bug,但是該場景的使用頻率很低,所以上線時沒暴露出來,只是偶爾會被觸發到。也是出現概率比較大的場景。
2)大面積故障
如果故障機器不存在共性,這個概率說實話非常非常小,但是如果碰到了,故障恢復小組能做的事情就比較有限了。
因為這個場景大概率是代碼存在bug,同時發布時沒有被大量觸發,而是到現在才被大量觸發,需要定位才能根本解決。
此時,故障恢復小組能做的就是使用擴容、重啟、限流等手段,來盡量維持服務的運轉,同時給故障定位爭取時間。
分析:之所以說該場景概率小是因為,分布在大量機器上的故障通常是使用頻率高的場景,這部分場景一般在服務發布時就會暴露出問題,而不是發布很久之后。但是這個場景也是確實存在的,但是會比較少。
3、故障定位
故障定位主要是用于應對故障恢復中的最后一個場景,也是將故障恢復和故障定位分成兩個小組并行執行的主要原因。
3.1、FGC 能正常回收到內存
通過監控或GC日志,我們能看到每次FGC后都能正常回收到內存,但是內存很快又被占滿,導致又出現FGC,從而出現FGC頻繁。
這個場景通常可能由于兩個原因導致:
1)Eden 區配置太小,導致大量對象直接進入老年代,從而導致老年代快速被占滿。
2)業務量較大,特別是在業務高峰期。而當前的服務器配置已經無法滿足當前的業務量。
對于這兩個原因,代碼本身可能沒有大問題,優先采取擴容機器,降低單臺服務器壓力即可解決。
后續則需要重新評估當前服務器的配置是否滿足當前的業務量,JVM參數是否存在優化空間等等。
分析:該場景是由于業務量增大沒有及時評估或者JVM參數配置存在問題導致的,整體來說,出現的概率較小。
3.2、FGC 不能正常回收到內存
通過監控或GC日志,我們能看到每次FGC后只能回收到很小的空間,甚至回收不到空間,從而出現FGC頻繁。
對于這個場景,二話不說,先dump下內存,使用工具看下當前的內存泄漏情況、內存分布情況等等,查看是哪個對象占用了大量內存。具體工具常見的例如 Eclipse MAT,如果公司內部有封裝的工具就更好了。
通常查看完內存占用情況,大概率會看到個別對象占用了大量的內存,結合其引用鏈定位出在代碼中的位置。
接著就是根據代碼分析問題的嚴重程度:
如果是小概率觸發的場景,大部分請求其實正常,則可以先禁用問題機器,后續上線修復即可。
如果是大概率觸發的場景,則查看是否存在降級開關,如果有則優先降級解決,如果沒有則只能修改代碼,走緊急修復流程。
總結
整體的解決流程其實還是比較簡單的,沒有太復雜的東西。大多數情況下,用好擴容、禁用、重啟這幾個常見手段即可解決大部分問題。
個人經驗而言,線上頻繁FGC問題90%以上是由于開發同學代碼存在問題導致的,例如常見的存在死循環、開無界隊列等等。以上的問題在dump后,很容易就能定位到根本原因。
而如果遇到諸如依賴的第三方jar存在bug導致的問題,例如Guava、Log4j,這種場景一般是在極端情況下出才會出現,所以一般只會出現在少數機器,禁用即可臨時解決,然后后續再慢慢排查。
最后
我是囧輝,一個堅持分享原創技術干貨的程序員,如果覺得本文對你有幫助,記得點贊關注,我們下期再見。
推薦閱讀
Java 基礎高頻面試題(2021年最新版)
Java 集合框架高頻面試題(2021年最新版)
面試必問的 Spring,你懂了嗎?
面試必問的 MySQL,你懂了嗎?
總結
以上是生活随笔為你收集整理的面试官:线上环境 FGC 频繁,如何解决?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 紫色特别舒服的UI趣味测试微信小程序源码
- 下一篇: 绕过tp路由器管理密码_tplogin.