您好,登錄后才能下訂單哦!
這篇文章主要介紹“JVM調優的方法是什么”,在日常操作中,相信很多人在JVM調優的方法是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”JVM調優的方法是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
了解JVM常用命令行參數
標準:-開頭,所有HotSpot都支持
非標準:-X開頭,特點版本HotSpot支持特定的命令
不穩定:-XX開頭,下個版本可能會取消的命令
java -version
java -X
調優代碼:
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會導致系統STW
jmap -histo 進程ID |head 20
jmap -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-server
BUILD_NAME=master-202003042222-13cae098a
BASE_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}/conf/server.properties
到此,關于“JVM調優的方法是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。