JVM性能參數調優實踐,不會執行Full GC,網站無停滯

来源:https://www.cnblogs.com/JamesWang1993/archive/2018/03/18/8597672.html
-Advertisement-
Play Games

無意中看到了這篇文章,占時還沒用到這個知識,主要解決網頁訪問量增加到一定數量級帶來的網站停滯問題。前些時候也學了JVM相關知識,先碼一下,以後也許有用 以下文章轉至原文http://blog.csdn.net/u014236541/article/details/50008047 JVM參數調優是個 ...


無意中看到了這篇文章,占時還沒用到這個知識,主要解決網頁訪問量增加到一定數量級帶來的網站停滯問題。前些時候也學了JVM相關知識,先碼一下,以後也許有用

以下文章轉至原文http://blog.csdn.net/u014236541/article/details/50008047

JVM參數調優是個很頭痛的問題,設置的不好,JVM不斷執行Full GC,導致整個系統變得很慢,網站停滯時間能達10秒以上,這種情況如果沒隔幾分鐘就來一次,自己都受不了。這種停滯在測試的時候看不出來,只有網站pv達到數十萬/天的時候問題就暴露出來了。 


要想配置好JVM參數,需要對年輕代、年老代、救助空間和永久代有一定瞭解,還要瞭解jvm記憶體管理邏輯,最終還要根據自己的應用來做調整。關於JVM參數上網一搜就能搜出一大把,也有很多提供實踐的例子,我也按照各種例子測試過,最終還是會出現問題。 

經過幾個月的實踐改善,我就網站(要求無停滯時間)的jvm參數調優給出以下幾條經驗。 

1:建議用64位操作系統,Linux下64位的jdk比32位jdk要慢一些,但是吃得記憶體更多,吞吐量更大。 

2:XMX和XMS設置一樣大,MaxPermSize和MinPermSize設置一樣大,這樣可以減輕伸縮堆大小帶來的壓力。 

3:調試的時候設置一些列印參數,如-XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log,這樣可以從gc.log里看出一些端倪出來。 

4:系統停頓的時候可能是GC的問題也可能是程式的問題,多用jmap和jstack查看,或者killall -3 java,然後查看java控制台日誌,能看出很多問題。有一次,網站突然很慢,jstack一看,原來是自己寫的URLConnection連接太多沒有釋放,改一下程式就OK了。 

5:仔細瞭解自己的應用,如果用了緩存,那麼年老代應該大一些,緩存的HashMap不應該無限制長,建議採用LRU演算法的Map做緩存,LRUMap的最大長度也要根據實際情況設定。 

6:垃圾回收時promotion failed是個很頭痛的問題,一般可能是兩種原因產生,第一個原因是救助空間不夠,救助空間里的對象還不應該被移動到年老代,但年輕代又有很多對象需要放入救助空間;第二個原因是年老代沒有足夠的空間接納來自年輕代的對象;這兩種情況都會轉向Full GC,網站停頓時間較長。第一個原因我的最終解決辦法是去掉救助空間,設置-XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0即可,第二個原因我的解決辦法是設置CMSInitiatingOccupancyFraction為某個值(假設70),這樣年老代空間到70%時就開始執行CMS,年老代有足夠的空間接納來自年輕代的對象。 

7:不管怎樣,永久代還是會逐漸變滿,所以隔三差五重起java伺服器是必要的,我每天都自動重起。 

8:採用併發回收時,年輕代小一點,年老代要大,因為年老大用的是併發回收,即使時間長點也不會影響其他程式繼續運行,網站不會停頓。 



我的最終配置如下(系統8G記憶體),每天幾百萬pv一點問題都沒有,網站沒有停頓,2009年shedewang.com沒有因為記憶體問題down過機。 

$JAVA_ARGS .= " -Dresin.home=$SERVER_ROOT -server -Xms6000M -Xmx6000M -Xmn500M -XX:PermSize=500M -XX:MaxPermSize=500M -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0 -Xnoclassgc -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=90 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log "; 

說明一下, -XX:SurvivorRatio=65536 -XX:MaxTenuringThreshold=0就是去掉了救助空間; 
-Xnoclassgc禁用類垃圾回收,性能會高一點; 
-XX:+DisableExplicitGC禁止System.gc(),免得程式員誤調用gc方法影響性能; 
-XX:+UseParNewGC,對年輕代採用多線程並行回收,這樣收得快; 
帶CMS參數的都是和併發回收相關的,不明白的可以上網搜索; 
CMSInitiatingOccupancyFraction,這個參數設置有很大技巧,基本上滿足(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn就不會出現promotion failed。在我的應用中Xmx是6000,Xmn是500,那麼Xmx-Xmn是5500兆,也就是年老代有5500兆,CMSInitiatingOccupancyFraction=90說明年老代到90%滿的時候開始執行對年老代的併發垃圾回收(CMS),這時還剩10%的空間是5500*10%=550兆,所以即使Xmn(也就是年輕代共500兆)里所有對象都搬到年老代里,550兆的空間也足夠了,所以只要滿足上面的公式,就不會出現垃圾回收時的promotion failed; 
SoftRefLRUPolicyMSPerMB這個參數我認為可能有點用,官方解釋是softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap,我覺得沒必要等1秒; 

網上其他介紹JVM參數的也比較多,估計其中大部分是沒有遇到promotion failed,或者訪問量太小沒有機會遇到,(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn這個公式絕對是原創,真遇到promotion failed了,還得這麼處理。


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

-Advertisement-
Play Games
更多相關文章
  • 準備 : jdk包和MyEclipse安裝包 1.點擊jdk安裝包 , 然後一直點下一步 , 點到最後就OK了 2.安裝MyEclipse : 1>雙擊MyEclipse 然後點next 2>接受按裝協議 先選中 I accept the terms of the license agreement ...
  • 確認本機已安裝python環境 查看pip版本 安裝psutil 卸載第三方庫 ...
  • 這題與超級鋼琴類似,然而重覆的不重覆計算貢獻。。 那麼先求出數組nxt,nxt[i]表示第i個元素之後的第一個與其相等的元素的下標,不存在則nxt[i]=0 考慮取的區間左端點為1時的情況。 將讀入序列a中相等元素都只保留最先出現的,其餘變為0,然後求首碼和,得到數組b。 此時可以知道,設f(l,r ...
  • 最近做Java Web項目,在.jsp頁面和servlet之間request和response還是有些混淆,查閱了一些資料,總結如下,方便以後使用: 首先,servlet介面是最基本的,提供的五個方法也不多說了,關鍵是瞭解清楚什麼是request,什麼事response。 簡單來說: request ...
  • Problem Description The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large re ...
  • 在業務中遇到了需要判斷文件是否存在的需求,所以順便整理一下python判斷文件是否存在的方法。在操作文件前,檢查文件是否存在也是一個良好的編程習慣。通常來說,有三種常見方式來判斷文件夾或文件是否存在,分別是os模塊,try語句和pathlib模塊。 os模塊 os模塊中的os.path.exists ...
  • 基本術語: 節點的度:書中某一節點擁有的子節點數量。 數的度:該樹中所有節點的度的最大值。 葉節點(終端節點):度為零的節點。 分支節點(非終端節點):度不為零的節點。 根節點(開始節點):樹中的第一個節點。 內部節點:樹中除了根節點之外的節點。 節點的層數:若根節點層數為1,根節點的第n代子節點的 ...
  • manifest文件是用來描述jar包的,它描述了該jar包的代碼是誰的,什麼版本,使用什麼版本的類庫等等。。。。具體如下: 1、基礎格式 manifest 文件的格式是很簡單的,每一行都是 名-值 對應的:屬性名開頭,接著是 ":" ,然後是屬性值,每行最多72個字元,如果需要增加,你可以在下一行 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...