瞭解JVM經常使用命令行參數java
標準:-開頭,全部HotSpot都支持web
非標準:-X開頭,特色版本HotSpot支持特定的命令數組
不穩定:-XX開頭,下個版本可能會取消的命令bash
java -versionapp
java -Xjvm
調優代碼:
ide
public class OomTest { public static void main(String[] args) { List<byte[]> bytes= new ArrayList<>(); for(;;){ byte[] b=new byte[1024*1024]; bytes.add(b); } }}JDK14 java -XX:+PrintCommandLineFlags OomTest.java-XX:G1ConcRefinementThreads=8 -XX:GCDrainStackTargetSize=64 -XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:MinHeapSize=6815736 -XX:+PrintCommandLineFlags -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseG1GC Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
JDK8 java -XX:+PrintCommandLineFlags OomTest.java-XX:InitialHeapSize=268435456 -XX:MaxHeapSize=4294967296 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
GC 垃圾回收器模式選擇工具
科學計算:吞吐量,數據挖掘,吞吐量優先的通常選擇:PS+PO優化
響應時間:網站,API G1網站
什麼是調優?(搞定了就重啓一次)
依據需求進行JVM規劃和預調優
優化運行JVM環境(慢,卡頓)
解決JVM運行過程當中出現的各類問題(OOM)
調優,從規劃開始
調優,從業務場景開始,沒有場景調優都是耍流氓
無監控,不調優
步驟
熟悉業務場景
響應時間,停頓時間【CMS,G1 ZGC】(須要給用戶作響應)
吞吐量=用戶/(用戶時間+GC時間)【PS PO-默認】
選擇回收器組合
計算內存需求
選定CPU(越高越好)
設定年代大小,升級年齡
設定日誌參數
觀察日誌狀況
經過top jstack 找出堆棧信息
# 第一步先top 找出 哪一個java進程佔用率最高top#顯示以下PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 24525 root 20 0 4909144 1.421g 6248 S 6.7 18.6 67:52.53 jsvc
# 第二步 使用top -Hp Pid 找出這個pid進程裏哪一個線程佔用率最高top -Hp 24525 顯然以下:PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 24624 root 20 0 4917660 1.427g 14548 S 2.7 18.7 0:30.39 jsvc # 第三步使用jstack查找改進程的堆棧信息,須要把top -Hp的PID轉換成16進制printf '%x\n' 24624 輸出:66030# 使用jstack -l pid(進程的)|grep 16進制(top- Hp線程PID)查找堆棧jstack -l 24525 |grep 66030輸出堆棧信息,結合源碼進行緣由查找使用jmap分析java進程的內存佔用分析使用jmap會致使系統STWjmap -histo 進程ID |head 20jmap -dump:format=b,file=xxx pid /jmap -histo
工具:阿里arthas工具使用
java -jar arthas-boot.jar按數組選擇java進程# 經常使用命令有1. dashboard :相似top命令實時檢控線程狀況2. jvm :把當前java進程的jvm配置所有顯示出來(棧,堆內存等等info)3. thread 能夠跟個線程ID:查看全部線程列表信息,後面跟着線程ID,4. heapdump : 導出堆內存狀況,會致使stw使用jhat -J-mx512M xxx.hprof
5. redefine 熱替換,線上直接替換文件
實際線上運行的jvm參數(jdk8用的G1,堆內存最大512m)
#!/bin/bash
SERVER_NAME=xx-xx-serverBUILD_NAME=master-202003042222-13cae098aBASE_DIR=/usr/local/xx/xxx-web-server
exec java \-Dfile.encoding=UTF-8 \-Dlogback.configurationFile=${BASE_DIR}/conf/logback.xml \-Xmx512m \-XX:+UseG1GC \-XX:MaxGCPauseMillis=100 \ # gc的清理間隔時間-XX:InitiatingHeapOccupancyPercent=35 \ # 啓動G1的堆空間佔用比例-verbose:gc \ # 類加載詳細過程-XX:+PrintGCDetails \ # GC詳情-XX:+PrintGCDateStamps \ # 打印gc啓動時間的相對時間-XX:+PrintGCTimeStamps \ # 打印發送GC的時間-XX:+PrintGCApplicationStoppedTime \ #打印GC的stw中止時間-Xloggc:${BASE_DIR}/logs/jvm_gc.log \ #打印GClog-XX:ErrorFile=${BASE_DIR}/logs/jvm_err.log \ #打印Gc報錯log-XX:+HeapDumpOnOutOfMemoryError \ # 導出oom異常對dump異常快照-XX:HeapDumpPath=${BASE_DIR}/logs/jvm_dump_pid%p.hprof \-jar ${BASE_DIR}/bin/xxx-xx-server-${BUILD_NAME}.jar ${BASE_DIR