JVM引數調優八大技巧之筆記
要想配置好JVM引數,需要對年輕代,年老代,救助空間和永久代有一定了解,還要了解jvm記憶體管理邏輯,最終還要根據自己的應用來做調整。
這裡和大家分享一下JVM引數調優的八條經驗,JVM引數調優,這是很頭痛的問題,設定的不好,JVM不斷執行FullGC,導致整個系統變得很慢,網站停滯時間能達10秒以上,相信通過本文的學習你對JVM引數調優有新的認識。
例項講解JVM引數調優的八條經驗
本文將介紹JVM引數調優,這是很頭痛的問題,設定的不好,JVM不斷執行FullGC,導致整個系統變得很慢,網站停滯時間能達10秒以上,這種情況如果沒隔幾分鐘就來一次,自己都受不了。這種停滯在測試的時候看不出來,只有網站pv達到數十萬/天的時候問題就暴露出來了。
要想配置好JVM引數,需要對年輕代、年老代、救助空間和永久代有一定了解,還要了解jvm記憶體管理邏輯,最終還要根據自己的應用來做調整。關於JVM引數上網一搜就能搜出一大把,也有很多提供實踐的例子,我也按照各種例子測試過,最終還是會出現問題。
經過幾個月的實踐改善,我就網站(要求無停滯時間)的jvm引數調優給出以下幾條經驗。
1.建議用64位作業系統,linux下64位的jdk比32位的jdk要慢一些,但是吃得記憶體更多,吞吐量更大。2.xMX和XMS設定一樣大,MaxPermSize和MinPermSize設定一樣大,這樣可以減輕伸縮堆大小帶來的壓力。
3.除錯的時候設定一些列印jvm引數,這樣可以從gc.log看出一些端倪出來。
4.系統停頓的時候可能是GC的問題也可能是程式的問題,多用jmap和jstack檢視,或者killall-3java,然後檢視java控制檯日誌,
能看出很多問題。有一次,網站突然很慢,jstack一看,原來是自己寫的URLConnection連線太多沒有釋放,改一下程式就ok了。
5.仔細瞭解自己的應用,如果用了快取,那麼年老代應該大一些,快取的Hashmap不應該無限制長,建議採用LRU(近期最少使用演算法)
的map做快取,lrumap的最大長度也要根據具體情況來看。
6.不管怎樣,永久代還是會逐漸變滿,所以隔三差五重啟java伺服器是必要的,我每天都自動重啟。
7.採用併發回收時,年輕代少一點,年老代要大,因為年老大用的是併發回收,即使時間長點也不會影響其他程式繼續執行,網站不會停頓。
希望從JVM的角度 去解釋 。
-Xms512m 堆的最小值
-Xmx1024m 堆的最大值
另外hotspot垃圾回收採用分代蒐集的方法,把堆分為三個部分,新域,舊域和永久域。Jvm生成的所有新物件放在新域中。一旦物件經歷了一定數量的垃圾收集迴圈後,便獲得使用期並進入舊域。在永久域中jvm則儲存class和method物件。就配置而言,永久域是一個獨立域並且不認為是堆的一部分
-XX:MaxPermSize=2設定永久域的最大值,
-XX:PermSize=256M設定永久域的初始值
我的最終配置如下(系統8G記憶體),每天幾百萬pv一點問題都沒有,網站沒有停頓,2009年網站沒有因為記憶體問題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就不會出現promotionfailed。在我的應用中Xmx是6000,Xmn是500,那麼Xmx-Xmn是5500兆,也就是年老代有5500兆,CMSInitiatingOccupancyFraction=90說明年老代到90%滿的時候開始執行對年老代的併發垃圾回收(CMS),這時還剩10%的空間是5500*10%=550兆,所以即使Xmn(也就是年輕代共500兆)裡所有物件都搬到年老代裡,550兆的空間也足夠了,所以只要滿足上面的公式,就不會出現垃圾回收時的promotionfailed;
SoftRefLRUPolicyMSPerMB這個引數我認為可能有點用,官方解釋是softlyreachableobjectswillremainaliveforsomeamountoftimeafterthelasttimetheywerereferenced.
Thedefaultvalueisonesecondoflifetimeperfreemegabyteintheheap,我覺得沒必要等1秒;
網上其他介紹JVM引數的也比較多,估計其中大部分是沒有遇到promotionfailed,或者訪問量太小沒有機會遇到,(Xmx-Xmn)*(100-CMSInitiatingOccupancyFraction)/100>=Xmn這個公式絕對是原創,真遇到promotionfailed了,還得這麼處理。
相關文章
- JVM 引數調優(qbit)JVM
- JVM常用調優引數JVM
- JVM記憶體引數詳解及其配置調優JVM記憶體
- JVM快速調優手冊v1.0之六:JVM引數設定、分析JVM
- 常用的 jvm 調優的引數都有哪些JVM
- 一次 JVM 調優的筆記JVM筆記
- hadoop之 引數調優Hadoop
- Hadoop2.7實戰v1.0之JVM引數調優HadoopJVM
- JVM調優引數、方法、工具以及案例總結JVM
- Oracle記憶體引數調優Oracle記憶體
- 淺談JVM整體架構與調優引數JVM架構
- 調優引數
- JVM面試問題系列:JVM 配置常用引數和常用 GC 調優策略JVM面試GC
- 檢視JVM預設引數及微調JVM啟動引數JVM
- JVM調優筆記(一)--Nacos GC引發的服務批次下線問題JVM筆記GC
- java jvm 引數 -Xms -Xmx -Xmn -Xss 調優總結JavaJVM
- JVM效能調優的6大步驟,及關鍵調優引數詳解JVM
- 數倉調優實戰:GUC引數調優
- mysql 引數調優MySql
- [HotSpot VM] JVM調優的"標準引數"的各種陷阱HotSpotJVM
- 1,Spark引數調優Spark
- Hadoop引數調優Hadoop
- JVM調優JVM
- 探探Java之 JVM GC與調優JavaJVMGC
- SAP ECC6.0記憶體引數調整和調優記憶體
- JVM記憶體引數配置JVM記憶體
- oracle筆記整理13——效能調優之SQL優化Oracle筆記SQL優化
- HBase 核心元件協調及RegionServer JVM引數調優-OLAP商業環境實戰元件ServerJVM
- JVM 引數調整對 sortx 的影響JVM
- 一次快速排序引發的jvm調優排序JVM
- irace package -- 引數調優神器Package
- Linux核心引數調優Linux
- linux 效能調優引數Linux
- Oracle記憶體引數調優技術詳解Oracle記憶體
- JVM調優總結-調優方法JVM
- JVM效能調優-演算法內功之剖析標記清除JVM演算法
- JVM效能調優,記憶體分析工具JVM記憶體
- JVM調優策略JVM