1.如何开始JVM调优
——tomcat内部署war包
修改TOMCAT_HOME/bin/catalina.sh文件
JAVA_OPTS="-Xms512m -Xmx1024m"
——linux环境下jar包启动springboot项目
启动时使用
nohup java -Xms512m -Xmx1024m -jar x.jar --spring.profiles.active=prod &
nohup:在系统后天不挂断地运行命令,退出终端不影响程序运行
java:启动java虚拟机
-Xms512m:堆初始化大小为0.5GB
-Xmx1024m:堆最大大小为1GB
-jar x.jar:指定要运行的jar文件
--spring.profiles.active:表示启动时使用的是生产环境
&:让命令在后台执行,终端退出后命令仍执行
2.JVM都有哪些调优参数
JVM调优主要是调整年轻代,老年代,元空间的内存大小以及使用的垃圾回收器类型
# 堆设置
# 初始化内存推荐为物理内存的1/64;最大设置推荐为物理内存1/4
# 堆太小会导致频繁发生年轻代与老年代的垃圾回收,产生STW影响用户体验
# 堆太大也会存在风险,如果发生了fullgc,会产生一个长时间的STW
-Xms:堆的初始化大小
-Xmx:堆的最大大小 # 不指定单位默认为自己,单位有:k,m,g
# 虚拟机栈设置,每个线程默认开启1m内存:存放栈帧、参数、局部变量
-Xss256k 对线程的stack大小设置,一般推荐256/512k
# 调整eden和survivor区,默认情况下为8:2。增大eden区会减少YGC(youngGC)次数,但是STW时间会延长
-XXSurvivorRatio=8 # 表示年轻代的分配比例,该情况就是默认的survivor:eden=2:8
# 年轻代晋升老年代阈值 默认值为15,取值范围0~15
-XX:MaxTenuringThreshold=threshold
# 设置垃圾回收器
-XX:+UseParallelGC
-XX:+userParallelOldGC
-XX:+UseG1GC
3.JVM调优用到哪些工具
- jps:进程状态信息
- jstack:查看堆栈内的线程信息,这里的pid通过jps可获取
- jstack [option] <pid>
- jmap:用于生成堆转内存快照、内存使用情况
- jmap -heap pid # 用于显示堆的信息
- jmap -dump:format=b,flie=heap.hprof pid # 该指令用于生成hprof文件,format=b表示以hprof二进制格式转储Java堆的新出,file=用于指定快照dump文件的名称
- jstat:JVM统计监测工具,用来显示垃圾回收信息、类加载信息、新生代统计信息
- jstat -gcutil pid # 以使用百分比的形式对垃圾回收统计
- jstat -gc pid # 以实际大小的形式对垃圾回收统计
可视化工具
- jconsole:对jvm的线程、内存、类的监控
- visualVM:能够监控线程,内存情况,查看方法的CPU时间和内存对象。只有jdk8有,后续版本不自带,需要去官网下载
4.内存泄漏排查问题思路
--内存泄漏通常是指堆内存一些大对象不被回收的情况
通过jmap指令获取dump文件/通过vm参数获取dump文件
// vm指令 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/app/dumps/
使用visualVM加载dump文件:在文件选项卡中选择装入
通过查看堆信息,定位内存溢出为止
5.CPU飙升解决思路
linux通过top指令查看CPU占用排行榜
top
在通过ps查看进程中所有线程信息
ps H -eo pid,tid,%cpu | grep <pid>
通过tid获取16进制转换
printf"%x\n" <tid>
根据16进制tid通过jstack去查看线程nid具体信息
jstack <pid>