这篇文章主要介绍“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调优的方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/220184.html