天天看點

java項目分析及調整堆大小

一、Java性能分析工具(JProfiler)

JProfiler是一個重量級的JVM監控工具,提供對JVM精确監控,其中堆周遊、CPU剖析、線程剖析看成定位目前系統瓶頸的得力工具。可以統計壓測過程中JVM的監控資料,定位性能問題。

JProfiler插件安裝(idea)

直接在IDEA上下載下傳File–Settings–plugins–Browse repositories ,找到jprofiler然後點選安裝。

java項目分析及調整堆大小

JProfiler監控軟體安裝

官方下載下傳位址:https://www.ej-technologies.com/download/jprofiler/files

按提示安裝

配置idea的JProfiler插件

java項目分析及調整堆大小

選擇JProfiler可執行檔案

idea中點選啟動進行分析

java項目分析及調整堆大小
java項目分析及調整堆大小

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-KVjAkwqs-1598939197749)(https://i.loli.net/2020/08/26/UbzrMt65T7IOGBP.png)]

更多操作參考:https://blog.csdn.net/vicky_pyh/article/details/88797514

二、JVM操作

一般的項目需要JVM調優嗎?

1、一般不需要調優,現代JVM的GC已經很給力了,并不需要調整很多參數。

2、很多廠的雲平台是高度定制的,釋出時會在容器中自動預設好參數,基本不需要改。

3、JVM 本身就是為這種低延時、高并發、大吞吐的服務設計和優化的,我們很少需要去改變什麼。是以,我們往往更偏重于應用服務本身的調優。

4、在一些應用中,比如大資料計算引擎,是一種非常極端的 JVM 應用,對延時的要求并不高,但對吞吐量要求很高,會有大量的短生命周期對象産生,同時也有大量的對象生存時間非常久,我們就需要對特定的一些 JVM 參數進行修改。

5、在沒有全面監控、收集性能資料之前,調優就是瞎調、并且可能會引發一系列問題。

參考:https://www.zhihu.com/question/362201242

https://blog.csdn.net/ljb622/article/details/105462672

JVM主要配置參數

在沒有全面監控、分析的情況下,-Xms -Xmx使用較多,其他不建議設定

參數名稱 含義 預設值
-Xms 初始堆大小 實體記憶體的1/64(<1GB) 預設(MinHeapFreeRatio參數可以調整)空餘堆記憶體小于40%時,JVM就會增大堆直到-Xmx的最大限制.
-Xmx 最大堆大小 實體記憶體的1/4(<1GB) 預設(MaxHeapFreeRatio參數可以調整)空餘堆記憶體大于70%時,JVM會減少堆直到 -Xms的最小限制
-Xmn 年輕代大小(1.4or lator) 注意:此處的大小是(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
-XX:MaxPermSize 設定持久代最大值 實體記憶體的1/4
-Xss 每個線程的堆棧大小 JDK5.0以後每個線程堆棧大小為1M,以前每個線程堆棧大小為256K.更具應用的線程所需記憶體大小進行 調整.在相同實體記憶體下,減小這個值能生成更多的線程.但是作業系統對一個程序内的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右 一般小的應用, 如果棧不是很深, 應該是128k夠用的 大的應用建議使用256k。這個選項對性能影響比較大,需要嚴格的測試。(校長) 和threadstacksize選項解釋很類似,官方文檔似乎沒有解釋,在論壇中有這樣一句話:"” -Xss is translated in a VM flag named ThreadStackSize” 一般設定這個值就可以了。
-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 對象超過多大是直接在舊生代配置設定 機關位元組 新生代采用Parallel Scavenge GC時無效 另一種直接在舊生代配置設定的情況是大的數組對象,且數組中無外部引用對象.
-XX:TLABWasteTargetPercent TLAB占eden區的百分比 1%
-XX:+CollectGen0First FullGC時是否先YGC false

三、調整JVM初始堆、最大堆

調整前:

java項目分析及調整堆大小
java項目分析及調整堆大小

設定初始堆、最大堆大小: -Xms128m -Xmx256m

39105366)]

[外鍊圖檔轉存中…(img-RQMCPSdP-1598939105371)]

設定初始堆、最大堆大小: -Xms128m -Xmx256m

java項目分析及調整堆大小