【Java面试】二十二、JVM篇(下):JVM参数调优与排查

文章目录

1、JVM的参数在哪里设置

  • war包部署,在tomcat中设置,修改TOMCAT_HOME/bin/catalina.sh 文件
  • jar包启动,直接java -jar 后面加
  • 镜像 + 容器启动,Dockerfile里加,和java -jar本质一样,虚拟机或实体机换更轻量的容器罢了

2、常见的JVM调优参数有哪些

  • 设置堆空间大小
  • 虚拟机栈的设置
  • 年轻代中 Eden 区和两个 Survivor 区的大小比例
  • 年轻代晋升老年代阈值
  • 设置垃圾回收器的种类

【调优参数】

进行JVM调优,避免频繁Full GC,以及选择适合业务场景的垃圾回收器等。比如设置堆空间大小,use、total、max三个值,让total = max,避免频繁向JVM申请内存。再比如栈大小的设置,一般256KB,用于存放每个线程的栈帧,这个值太大,则从栈可用空间层面限制了最大线程数量,比如设置了512KB,在总内存不变的情况下,线程数量上限就减半。再比如对象晋升老年代的阈值,默认15,一般不去改。至于垃圾回收器的选择,则可以先定一个可选组合,再Jmeter按业务测试几个场景,比如:

  • 高并发
  • 大对象产生

观察接口响应时间,响应峰值的出现,即FULL GC对接口响应时间的影响,由此选出适合自己业务场景的组合等等。

3、常见的JVM调优工具有哪些

有JDK自带的命令工具和一些可视化工具,还有一些网站,比如分析GC报告的GcEasy

命令工具有:

  • jps:进程状态信息

  • jstack:查看java进程内线程的堆栈信息,死锁时可以用,jstack 你的PID

  • jmap:显示堆信息,生成堆转储快照

  • jhat:堆转储快照分析工具

  • jstat:JVM统计监测工具

可视化工具有:

  • jconsole:用于对Jvm的内存,线程,类 的监控,JDK带的
  • VisualVM:能够监控线程,内存情况(有IDEA插件配置,和IDEA一起使用),也可以线程信息转储
  • MAT:堆内存分析,检测内存泄漏问题

4、Java内存泄漏的排查思路

内存泄漏,即一些对象没有被回收,累积导致OOM,表现为运行一段时间后服务宕机,但生产环境不能等服务挂了再修,可选择监控+告警邮件,比如普罗米修斯,让内存占用到一定阈值后,触发告警,此时可选择VisualVM分析

【内存泄漏分析工具】

  • 通过jmap或设置jvm参数获取堆内存快照dump文件

  • 再打开VisualVM去分析离线dump文件(开发环境也可以直接选择进程实时查看)

  • 从堆内存图中就可以看到是不是内存泄漏了,正常的堆内存图为锯齿状,有泄漏的则是占用在节节升高

  • 通过查看堆信息的情况,可以大概定位内存溢出是哪行代码出了问题,找到对应的代码,通过阅读上下文的情况,进行修复即可

  • 最后,分析内存泄漏也可以使用MAT,还是一样先导出堆内存快照

5、CPU飙高的排查思路

  • 使用top指令查看哪个进程占用CPU最高
  • top -p 进程ID继续看这个进程下的所有线程
  • 找出进程下占用高的线程
  • 做线程信息转储
java 复制代码
jstack 进程ID > /root/thread.tdump
  • 在转储文件中找到nio等于上面CPU占用高的线程,定位问题代码
java 复制代码
//转储文件中nio是十六进制,这里把CPU占用高的线程转一下
printf '%x\n' 线程ID
  • 分析


【排查示例】

相关推荐
YuTaoShao1 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
程序员张31 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端
llwszx4 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
云泽野5 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person5 小时前
Java SE--方法的使用
java·开发语言·算法
小阳拱白菜6 小时前
java异常学习
java
FrankYoou7 小时前
Jenkins 与 GitLab CI/CD 的核心对比
java·docker
麦兜*8 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
KK溜了溜了8 小时前
JAVA-springboot 整合Redis
java·spring boot·redis
天河归来8 小时前
使用idea创建springboot单体项目
java·spring boot·intellij-idea