了解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网站
什么是调优?(搞定了就重启一次)
依据需求进行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会致使系统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