当前位置: 首页 > news >正文

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

文章目录

  • 1、JVM的参数在哪里设置
  • 2、常见的JVM调优参数有哪些
  • 3、常见的JVM调优工具有哪些
  • 4、Java内存泄漏的排查思路
  • 5、CPU飙高的排查思路

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

在这里插入图片描述
【排查示例】

http://www.lryc.cn/news/376715.html

相关文章:

  • 统计信号处理基础 习题解答10-17
  • 嵌套使用模板类
  • adb卸载系统应用
  • Rapidfuzz,一个高效的 Python 模糊匹配神器
  • 【猫狗分类】Pytorch VGG16 实现猫狗分类1-数据清洗+制作标签文件
  • 磁盘管理 磁盘介绍 MBR
  • JSON响应中提取特定的信息——6.14山大软院项目实训2
  • 【C++高阶】高效搜索的秘密:深入解析搜索二叉树
  • 《软件定义安全》之七:SDN安全案例
  • java语言his系统医保接口 云HIS系统首页功能实现springboot框架+Saas模式 his系统项目源码
  • 使用vscode插件du-i18n处理前端项目国际化翻译多语言
  • 双系统下,如何隐藏另一个系统分区?
  • 电脑意外出现user32.dll丢失的八种修复方法,有效解决user32.dll文件丢失
  • CUDA系列-Kernel Launch-8
  • # 消息中间件 RocketMQ 高级功能和源码分析(四)
  • 如何通过数据库与AI实现以图搜图?OceanBase向量功能详解
  • Kafka内外网分流配置listeners和advertised.listeners
  • Linux系统编程——网络编程
  • 信息安全技术基础知识-经典题目
  • nextjs(持续学习中)
  • 数据预处理与特征工程、过拟合与欠拟合
  • 甲辰年五月十四风雨思
  • java分别使用 iText 7 库和iText 5 库 将excel转成PDF导出,以及如何对excel转PDF合并单元格
  • Java特性之设计模式【访问者模式】
  • 【教师资格证考试综合素质——法律专项】未成年人保护法笔记以及练习题
  • 6.19作业
  • java 线程之间通信-volatile 和 synchronized
  • 资源宝库网站!人人必备的神器!
  • Redis实战—优惠卷秒杀(锁/事务/代理对象的应用)
  • HTML星空特效