記一次JVM調優之旅(鬥爭full gc)

来源:http://www.cnblogs.com/syjkfind/archive/2016/06/17/5595452.html
-Advertisement-
Play Games

俗話說技多不壓身,當年苦讀《深入理解JVM》還專門整理了筆記,現在就用上了~ 筆記 http://www.cnblogs.com/syjkfind/p/3901774.html 【癥狀】 用戶操作數據導出時總會發生卡頓,後臺占記憶體的定時任務發生時也會。JVM參數就不貼了,比較普通且相對合理。 【思路 ...


俗話說技多不壓身,當年苦讀《深入理解JVM》還專門整理了筆記,現在就用上了~

筆記 http://www.cnblogs.com/syjkfind/p/3901774.html

【癥狀】 用戶操作數據導出時總會發生卡頓,後臺占記憶體的定時任務發生時也會。JVM參數就不貼了,比較普通且相對合理。

【思路】

查gc日誌是發生了full gc,tomcat日誌零零散散有很多exception。

另外憑著對代碼的瞭解,觸發時同時刻的日誌顯示正在執行較大數據量的查詢而且裝載進JVM,方法調用和臨時變數也很多。

【分析】

1.minor gc很頻繁,但時間短所以問題不大,觸發原因基本都是申請空間失敗。

2.偶爾有System.gc(),時間大概1分鐘。代碼中沒有顯式調用,基本確定是監控程式RMI訪問觸發的。可以加參數禁用 -XX:+DisableExplicitGC 。

3.時常有promotion failed,即在minor gc時年輕代的存活區空間不足而進入老年代,老年代又空間不足而觸發full gc。時間大概3分鐘。解決思路一種是增大存活區,一種則相反是去掉存活區增大老年代。相關參數一般有:

-XX:SurvivorRatio=32 存活區除以伊甸區的比率,存活區有from和to兩個,所以這裡的意思是單個存活區占年輕代的1/34;

-XX:OldSize=60M 老年代大小;

-XX:MaxTenuringThreshold=15 即多少次minor gc後存活的年輕代對象會晉升老年代。

4.經常有concurrent mode failure,即CMS執行過程中老年代空間不足,這時會變成Serial Old收集器導致更長時間的停頓。時間大概5分鐘。其中引發這一問題的情況可能是浮動垃圾太多、可能是CMS收集器本身也占用堆空間、也可能是老年代太多碎片,但都是CMS收集器的特性導致的。相關配置一般有:

-XX:CMSInitiatingOccupancyFraction=80 即老年代滿80%時觸發CMS(full gc),調高則full gc相對減少,調低則full gc處理得比較快;

-XX:UseCMSCompactAtFullCollection 或 -XX:CMSFullGCsBeforeCompaction=5 即full gc前或後做碎片整理。

5.另有個有趣的文章,過多過長的exception會導致promotion failed

http://www.th7.cn/Program/java/201511/685711.shtml

可能挺符合我們的場景的,沒有運維許可權,下次可以考慮找運維dump個分析一下對象。

以前為了追蹤錯誤關閉了“快拋” -XX:-OmitStackTraceInFastThrow 即反覆出現的exception不會用一個靜態的沒堆棧信息的實例去代替,這個要權衡一下了。

【解決】

創建很多對象占了年輕代?大對象導致占滿老年代?浮動垃圾(CMS時繼續在產生臨時對象)或老年代碎片?

調優多少是可以改善的,但似乎代碼本身更有問題,恐怕分配再多的記憶體都不夠吃。比如沒有應用較完善的一級緩存二級緩存,比如經常粗暴地把上萬條記錄載入進來,還沒做分頁,還有藏的比較深的做了切麵觸發非同步服務把非同步服務隊列占滿了。初期享受了框架的便利而考慮設計的少,而現在則要開始還技術債務了~

所幸的是在有限的時間里,我們有簡單粗暴有效的方法緩解這些問題:加伺服器,把大任務剝離出來~

而中長期的考慮來看,在不改變現有框架的前提下,整改exception、整改業務代碼做分頁、封裝資料庫分頁查詢框架、改造資料庫層二級緩存(集群範圍內緩存)會是比較有效的措施。

更長遠的肯定就是回歸Spring系主流框架,再者進軍服務化了。。。但那個幾乎要把業務代碼重新寫一遍,是後話了。

回歸主題如果是調優來解決問題,最好是dump了做更深入的分析。主觀上看來啟用快拋、gc後碎片整理、增大存活區應該是比較有針對性的調整,而CMSInitiatingOccupancyFraction取值和CMS各階段細緻的配置則需要更量化的分析。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在很多情況下,我們利用IOC控制反轉可以很方便實現一些介面的適配處理,可以在需要的時候切換不同的介面實現,使用這種方式在調用的時候,只需要知道相應的介面介面,具體調用哪個實現類,可以在配置文件中動態指定,本篇主要介紹AutoFac的IOC組件的使用,用來實現微信介面處理的控制反轉功能。 ...
  • 工具:svcutil.exe 參數:指定wsdl、輸出源碼文件、輸出配置文件 示例: D:\>svcutil.exe http://localhost:8087/DataService/?wsdl /out:Client.cs /config:app.configMicrosoft (R) Serv ...
  • 密封類 密封類使用sealed修飾符聲明。 密封類中不可能有抽象方法【因為:抽象方法必須在抽象類中,而抽象類不能是密封的或者是靜態的,也就是說abstract 和sealed不能同時修飾一個類】 ...
  • 抽象類使用abstract修飾符聲明; 不能創建抽象類的實例; 抽象類只能用作其他類的基類; 抽象類中可以包含抽象成員和普通的非抽象成員; 抽象類自己可以派生自另外一個抽象類; 任何派生自抽象類的【類】,必須使用override關鍵字,實現該類所有的成員,除非派生類自己也是抽象類。 示例: 1.基類 ...
  • 技術綜合 《小黃鴨調試法,每個程式員都要知道的》 《開發一個這樣的 APP 要多長時間?》 《一段代碼讓你覺得人類智慧可以璀璨無比》 《成人網站有多大?》 《輸入Google網址回車之後發生了什麼?》 《為什麼有些大公司技術弱爆了?》 《高效 MacBook 工作環境配置》 《如何編寫讓別人能讀懂的 ...
  • ASP.net 第一章:ASP.NET介紹 1.搭建ASP.NET開發環境; 2.理解ASP.NET運行機制; 3.掌握ASP.NET兩種編碼方式。 4.Http協議。 關鍵點: 1.BS的工作原理是什麼? 2.伺服器端開發技術有哪些? Asp 、aspx、jsp、php 3.ASP.NET發展史。 ...
  • 摘自:http://blog.csdn.net/dyllove98/article/details/9289553 資料庫生成位置可控制(其實主要就是DbContext的構造函數) 1.使用DbContext的構造函數:public DbContext(string nameOrConnection ...
  • 可以轉載,禁止修改。轉載請註明作者以及原文鏈接 註:本文是從貝葉斯分類器的角度來討論判別分析,有關貝葉斯分類器的概念可參考文末延伸閱讀第1-2篇文章。至於Fisher判別分析,未來會連同PCA一同討論。 判別分析也是一種分類器,與邏輯回歸相比,它具有以下優勢: 當類別的區分度高的時候,邏輯回歸的參數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...