JVM 最終篇-調優

瞭解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網站

什麼是調優?(搞定了就重啓一次)

  1. 依據需求進行JVM規劃和預調優

  1. 優化運行JVM環境(慢,卡頓)

  1. 解決JVM運行過程當中出現的各類問題(OOM)

調優,從規劃開始

  • 調優,從業務場景開始,沒有場景調優都是耍流氓

  • 無監控,不調優

  • 步驟

    1. 熟悉業務場景

      • 響應時間,停頓時間【CMS,G1 ZGC】(須要給用戶作響應)

      • 吞吐量=用戶/(用戶時間+GC時間)【PS PO-默認】

    1. 選擇回收器組合

    1. 計算內存需求

    1. 選定CPU(越高越好)

    1. 設定年代大小,升級年齡

    1. 設定日誌參數

    1. 觀察日誌狀況

     



經過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
相關文章
相關標籤/搜索