【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 分钟前
前端性能救星!用 requestAnimationFrame 丝滑渲染海量数据
前端·javascript·面试
江城开朗的豌豆5 分钟前
src和href:这对'双胞胎'属性,你用对了吗?
前端·javascript·面试
江城开朗的豌豆11 分钟前
forEach遇上await:你的异步代码真的在按顺序执行吗?
前端·javascript·面试
甜甜的资料库17 分钟前
基于微信小程序的作业管理系统源码数据库文档
java·数据库·微信小程序·小程序
xzkyd outpaper3 小时前
从面试角度回答Android中ContentProvider启动原理
android·面试·计算机八股
有梦想的骇客6 小时前
书籍“之“字形打印矩阵(8)0609
java·算法·矩阵
yours_Gabriel6 小时前
【java面试】微服务篇
java·微服务·中间件·面试·kafka·rabbitmq
hashiqimiya8 小时前
android studio中修改java逻辑对应配置的xml文件
xml·java·android studio
liuzhenghua668 小时前
Python任务调度模型
java·运维·python