性能優化(JVM優化)

JIT優化

GCRootjava

全部正在運行的線程的棧上的引用變量。全部的全局變量。全部
ClassLoader。。。
1.System Class
.2.JNI Local
3.JNI Global
4.Thread Block
5.Busy Monitor
6.Java Local
7.Native Stack
8.Unfinalized
9.Unreachable
10.Java Stack Frame
11.Unknowngit

棧幀說明github

Java虛擬機棧(Java Virtual Machine Stacks)是線程私有的,它的生命週期與線程相同。虛擬機棧描述的是Java方法執行的內存模型:每一個方法被執行的時候都會同時建立一個棧幀(Stack Frame)用於存儲局部變量表、操做棧、動態連接、方法出口等信息。每個方法被調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程。瀏覽器

方法區說明服務器

與Java堆同樣,是各個線程共享的內存區域,它用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據。併發

常規優化函數

一、禁用System.gc
二、逃逸分析與標題替換
三、關閉偏向鎖優化
四、指針壓縮
五、getter方法優化工具

參數設置性能

一、-XX:-DisableExplicitGC,禁用了System.gc()的顯示調用
二、逃逸分析默認是啓用的,-XX:+DoEscapeAnalysis。後續有三種優化會進行:棧內分配,同步消除,標量替換
四、偏向鎖,關閉: -XX:-UseBiasedLocking-XX:+UseBiasedLocking -XX:BiasedLockingStartupDelay=0
五、指針壓縮,-XX:+UseCompressedOops
六、getter方法優化,-XX:UseFastAccessorMethods測試

解釋

分析對象動態做用域:當一個對象在方法中被定義後,它可能被外部方法所引用,例如做爲調用參數傳遞到其餘方法中,稱爲方法逃逸。  甚至還有可能被外部線程訪問到,譬如賦值給類變量或能夠在其餘線程中訪問的實例變量,稱爲線程逃逸。

棧上分配(Stack Allocation ):若是肯定一個對象不會逃逸出方法以外,那讓這個對象在棧上分配內存將會是一個很不錯的主意。因爲HotSpot 虛擬機目前的實現方式致使棧上分配實現起來比較複雜,所以在HotSpot 中暫時尚未作這項優化 。

同步消除(Synchronization Elimination ):線程同步自己是一個相對耗時的過程,若是逃逸分析能
夠肯定一個變量不會逃逸出線程,沒法被其餘線程訪問,那這個變量的讀寫確定就不會有競爭,對
這個變量實施的同步措施也就能夠消除掉 。

標量替換(Scalar Replacement ):標量(Scalar )是指一個數據已經沒法再分解成更小的數據來表示了,Java 虛擬機中的原始數據類型(int 、 long 等數值類型以及reference 類型等)都不能再進一步分解,它們就能夠稱爲標量。  相對的,若是一個數據能夠繼續分解,那它就稱做聚合量(Aggregate ),Java 中的對象就是最典型的聚合量。  若是把一個Java 對象拆散,根據程序訪問的狀況,將其使用到的成員變量恢復原始類型來訪問就叫作標量替換。  若是逃逸分析證實一個對象不會被外部訪問,而且這個對象能夠被拆散的話,那程序真正執行的時候將可能不建立這個對象,而改成直接建立它的若干個被這個方法使用到的成員變量來代替 。

JIT優化

一、開啓服務端模式
二、增長內聯函數的可能性
三、提升編譯的可能性
四、下降線程優先級
五、熱度衰減與半衰週期

參數

一、服務端模式,-server
二、final的函數是向編譯器建議能夠內聯,啓動參數不宜設置
三、提升編譯的可能性,小方法,-XX:CompileThreshold=10000
四、線程優先級,Linux不能設置,須要root權限
五、熱度衰減與半衰週期

解釋

OSR編譯閾值

A、調用計數器,即方法被調用的次數,CompileThreshold,該值是指當方法被調用多少次後,就編譯爲機器碼,client模式默認爲1500次,server模式默認爲1萬次,能夠在啓動時添加-XX:CompileThreshold=10000來設置該值。
B、回邊計數器,即方法中循環執行部分代碼的執行次數,OnStackReplacePercentage,該值用於/參與計算是否觸發OSR編譯的閾值,client默認爲933,sever默認爲140,能夠經過-XX:OnStackReplacePercentage=140來設置。

client模式下的計算規則爲CompileThreshold*OnStackReplacePercentage/100,server模式下計算規則爲
CompileThreshold*(OnStackReplacePercentage-InterpreterProfilePercentage)/100。InterpreterProfilePercentage,默認爲33。

內存優化

思路

一、將新對象預留在年輕代
二、讓大對象進入年老代
三、設置對象進入年老代的年齡
四、穩定的 Java 堆
五、增大吞吐量提高系統性能
六、使用非佔有的垃圾回收器

參數

一、將新對象預留在年輕代,-XX:TargetSurvivorRatio=90
二、讓大對象進入年老代,-XX:PetenureSizeThreshold=1000000,1M
三、設置對象進入年老代的年齡,-XX:MaxTenuringThreshold=31
四、穩定的 Java 堆 ,Xmx與Xms相同
5 、 增 大 吞 吐 量 提 升 系 統 性 能 , – X X : + U s e P a r a l l e l G C ,–XX:+UseParallelOldGC,–XX:ParallelGC-Threads(CPU核心數相等)
六、使用非佔有的垃圾回收器,–XX:+UseConcMarkSweepGC

 

監控及工具

工具

jps:虛擬機進程情況工具

它的功能也和ps命令相似:能夠列出正在運行的虛擬機進程,並顯示虛擬機執行主類(Main Class,main()函數所在的類)名稱以及這些進程的本地虛擬機惟一ID(Local Virtual Machine Identifier,LVMID)。jps能夠經過RMI協議查詢開啓了RMI服務的遠程虛擬機進程狀態,hostid爲RMI註冊表中註冊的主機名。

jstat:虛擬機統計信息監視工具

用於監視虛擬機各類運行狀態信息的命令行工具。它能夠顯示本地或者遠程虛擬機進程中的類裝載、內存、垃圾收集、JIT編譯等運行數據,在沒有GUI圖形界面,只提供了純文本控制檯環境的服務器上,它將是運行期定位虛擬機性能問題的首選工具。

jmap:Java內存映像工具

map的做用並不只僅是爲了獲取dump文件,它還能夠查詢finalize執行隊列、Java堆和永久代的詳細信息,如空間使用率、當前用的是哪一種收集器等。

 

其餘工具

jinfo:Java配置信息工具做用是實時地查看和調整虛擬機各項參數。使用-sysprops選項把虛擬機進程System.getProperties()的內容打印出來。

jhat:虛擬機堆轉儲快照分析工具jhat內置了一個微型的HTTP/HTML服務器,生成dump文件的分析結果後,能夠在瀏覽器中查看。

HSDIS:JIT生成代碼反彙編HSDIS是一個HotSpot虛擬機JIT編譯代碼的反彙編插件,它包含在HotSpot虛擬機的源碼之中,但沒有提供編譯後的程序。

 

可視化工具

JConsole:Java監視與管理控制檯JConsole(Java Monitoring and Management Console)是一種基於JMX的可視化監視、管理工具。它管理部分的功能是針對JMX MBean進行管理,因爲MBean可使用代碼、中間件服務器的管理控制檯或者全部符合JMX規範的軟件進行訪問。

VisualVM:多合一故障處理工具VisualVM(All-in-One Java Troubleshooting Tool)是到目前爲止隨JDK發佈的功能最強大的運行監視和故障處理程序。VisualVM的還有一個很大的優勢:不須要被監視的程序基於特殊Agent運行,所以它對應用程序的實際性能的影響很小,使得它能夠直接應用在生產環境。

JMC:Oracle Java Mission Control 是一個用於對 Java 應用程序進行管理、監視、概要分析和故障排除的工具套件。首次安裝時,Java Mission Control 包括 JMX 控制檯和 Java 飛行記錄器。從 Mission Control 中能夠輕鬆安裝更多插件

 

JITWatch

安裝:

git clone git@github.com:AdoptOpenJDK/jitwatch.git
cd jitwatch
mvn clean install -DskipTests=true

運行:launchUI.bat
使用:XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:+PrintAssembly

查看結果。

配置建議

服務器:8 cup, 8G mem
e.g.
java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
 

調優方案:
-Xmx5g:設置JVM最大可用內存爲5G。
-Xms5g:設置JVM初始內存爲5G。此值能夠設置與-Xmx相同,以免每次垃圾回收完成後JVM從新分配內存。
-Xmn2g:設置年輕代大小爲2G。整個堆內存大小 = 年輕代大小 + 年老代大小 + 持久代大小 。持久代通常固定大小爲64m,因此增大年輕代後,將會減少年老代大小。此值對系統性能影響較大,Sun官方推薦配置爲整個堆的3/8。
-XX:+UseParNewGC:設置年輕代爲並行收集。可與CMS收集同時使用。JDK5.0以上,JVM會根據系統配置自行設置,因此無需再設置此值。
-XX:ParallelGCThreads=8:配置並行收集器的線程數,即:同時多少個線程一塊兒進行垃圾回收。此值最好配置與處理器數目相等。
-XX:SurvivorRatio=6:設置年輕代中Eden區與Survivor區的大小比值。根據經驗設置爲6,則兩個Survivor區與一個Eden區的比值爲2:6,一個Survivor區佔整個年輕代的1/8。
-XX:MaxTenuringThreshold=30: 設置垃圾最大年齡(次數)。若是設置爲0的話,則年輕代對象不通過Survivor區直接進入年老代。對於年老代比較多的應用,能夠提升效率。若是將此值 設置爲一個較大值,則年輕代對象會在Survivor區進行屢次複製,這樣能夠增長對象再年輕代的存活時間,增長在年輕代即被回收的機率。設置爲30表示 一個對象若是在Survivor空間移動30次尚未被回收就放入年老代。
-XX:+UseConcMarkSweepGC:設置年老代爲併發收集。測試配置這個參數之後,參數-XX:NewRatio=4就失效了,因此,此時年輕代 大小最好用-Xmn設置,所以這個參數不建議使用。

相關文章
相關標籤/搜索