今日感悟
逆境使人成熟,絕境使人醒悟。麥穗越成熟越懂得彎腰,人越懂得彎腰才會越成熟。不要把别人對自己的放棄,變成自己對自己的放棄。人生的日子都是越過越少,剩下的日子都是越來越重要。所謂順其自然,并非代表我們可以不努力,而是努力之後我們有勇氣接受一切的成敗。加油未來的每一天!!!
JVM日常參數配置
JAVA_OPTS=" -Xmx512m -Xms512m -Xmn170m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4"
例子講解
-Xmx512m:設定Java虛拟機的堆最大可用記憶體大小,機關:兆;整個堆大小=年輕代+年老代+持久代。持久代一般固定65m。
-Xms512m:設定Java虛拟機的堆的初始值記憶體大小,機關:兆,可以設定和-Xmx一樣,避免每次垃圾回收完成後JVM重新配置設定記憶體;
-Xmn170m:設定年輕代記憶體大小,機關:兆,Sun官方推薦為整個堆的3/8。
-Xss128k:設定每個線程的棧大小。JDK5.0之前是256K,JDK5.0後每個線程大小為1M;
-XX:NewRatio=4:設定年輕代(Eden和2個Survivor區)與老年代的比值(不包含持久代),設定=4,則年輕代:老年代=1:4,年輕代占整個堆棧的1/5;
-XX:SurvivorRatio=4:設定年輕代中Eden區與Survivor區的比值,設定=4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個年輕代的1/6
-XX:MaxPermSize=16m:設定持久代為16m;
-XX:MaxTenuringThreshold=0;設定垃圾最大年齡;
JVM常見參數設定說明
-Xms:初始堆大小實體記憶體的1/64(<1GB),預設(MinHeapFreeRatio參數可以調整)空餘堆記憶體小于40%時,JVM就會增大堆直到-Xmx的最大限制.
-Xmx:最大堆大小 實體記憶體的1/4(<1GB) 預設(MaxHeapFreeRatio參數可以調整)空餘堆記憶體大于70%時,JVM會減少堆直到 -Xms的最小限制
-Xmn:年輕代大小(1.4 or later) 注意:此處的大小是(eden+ 2 survivor space)。與jmap -heap中顯示的New gen是不同的。 整個堆大小=年輕代大小 + 年老代大小 + 持久代大小. 增大年輕代後,将會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8
-XX:NewSize:設定年輕代大小(for 1.3/1.4)
-XX:MaxNewSize:年輕代最大值(for 1.3/1.4)
-XX:PermSize:設定持久代(perm gen)初始值實體記憶體的1/64,JDK1.8之前:以實體記憶體為4GB為例,4G的1/64是64MB;4G的1/4是1024MB,那麼PermSize就是64MB(預設值),也就是Java永生代記憶體初始大小;而 MaxPermSize的大小就是1024MB了
-XX:MaxPermSize:設定持久代最大值實體記憶體的1/4。
-Xss:每個線程的堆棧大小,JDK5.0以後每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需記憶體大小進行調整.在相同實體記憶體下,減小這個值能生成更多的線程。但是作業系統對一個程序内的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右 一般小的應用, 如果棧不是很深, 應該是128k夠用的大的應用建議使用256k。這個選項對性能影響比較大,需要嚴格的測試。
-XX:ThreadStackSize:Thread Stack Size (0 means use default stack size) [Sparc: 512; Solaris x86: 320 (was 256 prior in 5.0 and earlier); Sparc 64 bit: 1024; Linux amd64: 1024 (was 0 in 5.0 and earlier); all others 0.]
-XX:NewRatio:年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代) -XX:NewRatio=4表示年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5,Xms=Xmx并且設定了Xmn的情況下,該參數不需要進行設定。
-XX:SurvivorRatio:Eden區與Survivor區的大小比值設定為8,則兩個Survivor區與一個Eden區的比值為2:8,一個Survivor區占整個年輕代的1/10
-XX:LargePageSizeInBytes:記憶體頁的大小不可設定過大,會影響Perm的大小=128m
-XX:+UseFastAccessorMethods 原始類型的快速優化
-XX:+DisableExplicitGC:關閉System.gc() 這個參數需要嚴格的測試
-XX:MaxTenuringThreshold:垃圾最大年齡如果設定為0的話,則年輕代對象不經過Survivor區,直接進入年老代. 對于年老代比較多的應用,可以提高效率.如果将此值設定為一個較大值,則年輕代對象會在Survivor區進行多次複制,這樣可以增加對象再年輕代的存活 時間,增加在年輕代即被回收的機率 該參數隻有在串行GC時才有效.
-XX:+AggressiveOpts:加快編譯,優化代碼
-XX:+UseBiasedLocking:鎖機制的性能改善 ,開啟偏向鎖
-Xnoclassgc:禁用垃圾回收
-XX:SoftRefLRUPolicyMSPerMB 每兆堆空閑空間中SoftReference的存活時間 1s 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
-XX:PretenureSizeThreshold 對象超過多大是直接在舊生代配置設定 0 機關位元組 新生代采用Parallel Scavenge GC時無效,另一種直接在舊生代配置設定的情況是大的數組對象,且數組中無外部引用對象.
-XX:TLABWasteTargetPercent TLAB占eden區的百分比 1%
-XX:+CollectGen0First:FullGC時是否先YGC false
JVM輔助資訊參數設定
-XX:+PrintGC 輸出形式:[GC 118250K->113543K(130112K), 0.0094143 secs] [Full GC 121376K->10414K(130112K), 0.0650971 secs]
-XX:+PrintGCDetails 輸出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] [GC DefNew: 8614K-
8614K(9088K), 0.0000665 secs 121376K->10414K(130112K), 0.0436268 secs]
-XX:+PrintGCTimeStamps
-XX:+PrintGC:PrintGCTimeStamps 可與-XX:+PrintGC -XX:+PrintGCDetails混合使用 輸出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
-XX:+PrintGCApplicationStoppedTime 列印垃圾回收期間程式暫停的時間.可與上面混合使用 輸出形式:Total time for which application threads were stopped: 0.0468229 seconds
-XX:+PrintGCApplicationConcurrentTime 列印每次垃圾回收前,程式未中斷的執行時間.可與上面混合使用 輸出形式:Application time: 0.5291524 seconds
-XX:+PrintHeapAtGC 列印GC前後的詳細堆棧資訊
-Xloggc:filename 把相關日志資訊記錄到檔案以便分析. 與上面幾個配合使用
-XX:+PrintClassHistogram garbage collects before printing the histogram.
-XX:+PrintTLAB 檢視TLAB空間的使用情況
-XX:+PrintTenuringDistribution 檢視每次minor GC後新的存活周期的門檻值 Desired survivor size 1048576 bytes, new threshold 7 (max 15) new threshold 7即辨別新的存活周期的門檻值為7。
GC調優思路
- 分析場景——例如:啟動速度慢;偶爾出現響應慢于平均水準或者出現卡頓。
- 确定目标——記憶體占用、低延時、吞吐量。
- 收集日志——通過參數配置收集GC日志;通過JDK工具檢視GC狀态
- 分析日志——使用工具輔助分析日志,檢視GC次數,GC時間
- 調整參數——切換垃圾收集器或者調整垃圾收集器參數
Tomcat調優
- maxThreads="300":設定目前Tomcat最大并發數,預設150,實際開發中,某個應用超過250個并發時會考慮應用伺服器的叢集;
- minSpareThreads="50":設定目前Tomcat初始化時建立的線程,預設25;
- maxKeepAliveRequests=”1” 就可以避免tomcat産生大量的TIME_WAIT連接配接,進而從一定程度上避免tomcat假死。