溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

JVM調(diào)優(yōu)的方法是什么

發(fā)布時(shí)間:2021-12-18 14:51:33 來(lái)源:億速云 閱讀:123 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“JVM調(diào)優(yōu)的方法是什么”,在日常操作中,相信很多人在JVM調(diào)優(yōu)的方法是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”JVM調(diào)優(yōu)的方法是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

了解JVM常用命令行參數(shù)

  • 標(biāo)準(zhǔn):-開(kāi)頭,所有HotSpot都支持

  • 非標(biāo)準(zhǔn):-X開(kāi)頭,特點(diǎn)版本HotSpot支持特定的命令

  • 不穩(wěn)定:-XX開(kāi)頭,下個(gè)版本可能會(huì)取消的命令

java -version

java -X

調(diào)優(yōu)代碼:

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 垃圾回收器模式選擇

科學(xué)計(jì)算:吞吐量,數(shù)據(jù)挖掘,吞吐量?jī)?yōu)先的一般選擇:PS+PO

響應(yīng)時(shí)間:網(wǎng)站,API  G1

什么是調(diào)優(yōu)?(搞定了就重啟一次)

  1. 依據(jù)需求進(jìn)行JVM規(guī)劃和預(yù)調(diào)優(yōu)

  1. 優(yōu)化運(yùn)行JVM環(huán)境(慢,卡頓)

  1. 解決JVM運(yùn)行過(guò)程中出現(xiàn)的各種問(wèn)題(OOM)

調(diào)優(yōu),從規(guī)劃開(kāi)始

  • 調(diào)優(yōu),從業(yè)務(wù)場(chǎng)景開(kāi)始,沒(méi)有場(chǎng)景調(diào)優(yōu)都是耍流氓

  • 無(wú)監(jiān)控,不調(diào)優(yōu)

  • 步驟

    1. 熟悉業(yè)務(wù)場(chǎng)景

      • 響應(yīng)時(shí)間,停頓時(shí)間【CMS,G1 ZGC】(需要給用戶(hù)做響應(yīng))

      • 吞吐量=用戶(hù)/(用戶(hù)時(shí)間+GC時(shí)間)【PS PO-默認(rèn)】

    1. 選擇回收器組合

    1. 計(jì)算內(nèi)存需求

    1. 選定CPU(越高越好)

    1. 設(shè)定年代大小,升級(jí)年齡

    1. 設(shè)定日志參數(shù)

    1. 觀察日志情況

     JVM調(diào)優(yōu)的方法是什么

通過(guò)top jstack 找出堆棧信息

# 第一步先top 找出 哪個(gè)java進(jìn)程占用率最高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 找出這個(gè)pid進(jìn)程里哪個(gè)線程占用率最高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查找改進(jìn)程的堆棧信息,需要把top -Hp的PID轉(zhuǎn)換成16進(jìn)制printf '%x\n' 24624 輸出:66030# 使用jstack -l pid(進(jìn)程的)|grep 16進(jìn)制(top- Hp線程PID)查找堆棧jstack -l 24525 |grep 66030輸出堆棧信息,結(jié)合源碼進(jìn)行原因查找使用jmap分析java進(jìn)程的內(nèi)存占用分析使用jmap會(huì)導(dǎo)致系統(tǒng)STWjmap -histo 進(jìn)程ID |head 20jmap -dump:format=b,file=xxx pid /jmap -histo

工具:阿里arthas工具使用

java -jar arthas-boot.jar按數(shù)組選擇java進(jìn)程# 常用命令有1. dashboard :類(lèi)似top命令實(shí)時(shí)檢控線程情況2. jvm :把當(dāng)前java進(jìn)程的jvm配置全部顯示出來(lái)(棧,堆內(nèi)存等等info)3. thread 可以跟個(gè)線程ID:查看所有線程列表信息,后面跟著線程ID,4. heapdump : 導(dǎo)出堆內(nèi)存情況,會(huì)導(dǎo)致stw使用jhat -J-mx512M xxx.hprof
5. redefine 熱替換,線上直接替換文件

 實(shí)際線上運(yùn)行的jvm參數(shù)(jdk8用的G1,堆內(nèi)存最大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的清理間隔時(shí)間-XX:InitiatingHeapOccupancyPercent=35 \  # 啟動(dòng)G1的堆空間占用比例-verbose:gc \        # 類(lèi)加載詳細(xì)過(guò)程-XX:+PrintGCDetails \       # GC詳情-XX:+PrintGCDateStamps \      # 打印gc啟動(dòng)時(shí)間的相對(duì)時(shí)間-XX:+PrintGCTimeStamps \    # 打印發(fā)送GC的時(shí)間-XX:+PrintGCApplicationStoppedTime \  #打印GC的stw停止時(shí)間-Xloggc:${BASE_DIR}/logs/jvm_gc.log \  #打印GClog-XX:ErrorFile=${BASE_DIR}/logs/jvm_err.log \ #打印Gc報(bào)錯(cuò)log-XX:+HeapDumpOnOutOfMemoryError \    # 導(dǎo)出oom異常對(duì)dump異??煺?/code>-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

到此,關(guān)于“JVM調(diào)優(yōu)的方法是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

jvm
AI