【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
  • 分析


【排查示例】

相关推荐
程序员晓琪4 分钟前
约定大于配置:基于 Java 包名自动生成 API 版本路由的最佳实践
java·spring boot·后端
Flittly9 分钟前
【AgentScope Java新手村系列】(11)中断与恢复
java·spring boot·spring
众少成多积小致巨35 分钟前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
东坡白菜1 小时前
破局全栈:前端开发的Java入门实战记录—JPA(2)
java·后端
阳火锅1 小时前
😭测试小姐姐终于不骂我了!这个提BUG神器太香了...
前端·javascript·面试
林希_Rachel_傻希希3 小时前
js里面的proxy理解。以及vue3响应式数据设计底层
前端·javascript·面试
SimonKing7 小时前
艹,维护AI写的代码,我心态崩了......
java·后端·程序员
用户1563068103517 小时前
Day01 | 什么是Agent?
面试
用户298698530147 小时前
Java Word 文档样式进阶:段落与文本背景色设置完全指南
java·后端
写代码的皮筏艇7 小时前
React中的forwardRef
前端·react.js·面试