温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

JVM调优的方法是什么

发布时间:2021-12-18 14:51:33 来源:亿速云 阅读:109 作者:iii 栏目:大数据

这篇文章主要介绍“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

什么是调优?(搞定了就重启一次)

  1. 依据需求进行JVM规划和预调优

  1. 优化运行JVM环境(慢,卡顿)

  1. 解决JVM运行过程中出现的各种问题(OOM)

调优,从规划开始

  • 调优,从业务场景开始,没有场景调优都是耍流氓

  • 无监控,不调优

  • 步骤

    1. 熟悉业务场景

      • 响应时间,停顿时间【CMS,G1 ZGC】(需要给用户做响应)

      • 吞吐量=用户/(用户时间+GC时间)【PS PO-默认】

    1. 选择回收器组合

    1. 计算内存需求

    1. 选定CPU(越高越好)

    1. 设定年代大小,升级年龄

    1. 设定日志参数

    1. 观察日志情况

     JVM调优的方法是什么

通过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}/conf/server.properties

到此,关于“JVM调优的方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

jvm
AI