JVM调优

JVM调优一般分两种情况考虑:
1、根据需求进行JVM的规划和预调优。
吞吐量、及时响应的需求不同使用不同的垃圾回收器。根据系统使用的技术,进行内存参数配置(如:netty,堆内存与对外内存1:1。其他可以设置2:1)。
2、优化正在运行中的jvm(慢,卡顿)
已运行JVM需要以下数据:
①、CPU,磁盘,内存的IO监控数据
②、JVM的监控数据
③、压测数据
可进行堆内存参数配置,选择不同的垃圾回收器,分带年龄配置,优化程序代码等手段优化。
场景:
①、导入导出。
②、最小启动内存配置。
③、程序代码优化,如增加池化处理,如异步线程池、数据库线程池、redis线程池等。
3、解决jvm运行中的各种问题,oom等。

调优JVM其实就是在理解JVM内存结构以及各种垃圾收集器前提下,结合自己的现有的业务来调整参数,使自己的应用能够正常稳定运行。
一般调优JVM我们认为会有几种指标可以参考:『吞吐量』、『停顿时间』和『垃圾回收频率』。
基于这些指标,我们就有可能需要调整:

  1. 内存区域大小以及相关策略
    比如:整块堆内存占多少、新生代占多少、老年代占多少、Survivor占多少、晋升老年代的条件等等
    比如:-Xmx:设置堆的最大值、-Xms:设置堆的初始值、-Xmn:表示年轻代的大小、-XX:SurvivorRatio:伊甸区和幸存区的比例等等
    按经验来说:IO密集型的可以稍微把「年轻代」空间加大些,因为大多数对象都是在年轻代就会灭亡。内存计算密集型的可以稍微把「老年代」空间加大些,对象存活时间会更长些
  2. 垃圾回收器
    选择合适的垃圾回收器,以及各个垃圾回收器的各种调优参数
    比如:-XX:+UseG1GC:指定 JVM 使用的垃圾回收器为 G1、-XX:MaxGCPauseMillis:设置目标停顿时间、-XX:InitiatingHeapOccupancyPercent:当整个堆内存使用达到一定比例,全局并发标记阶段 就会被启动等等
    没错,这些都是因地制宜,具体问题具体分析(前提是得懂JVM的各种基础知识,基础知识都不懂,谈何调优)

一般我们是「遇到问题」之后才进行调优的,而遇到问题后需要利用各种的「工具」进行排查

  1. 通过jps命令查看Java进程「基础」信息(进程号、主类)。这个命令很常用的就是用来看当前服务器有多少Java进程在运行,它们的进程号和加载主类是啥
  2. top命令查看,cpu状态信息,内存使用信息,进程相关信息。
  3. cat工具查看CPU,内存,垃圾回收频率。判断是否有问题。
  4. 还有比较热门的Arthas(阿里开源的诊断工具),涵盖了上面很多命令的功能且自带图形化界面。这也是我这边常用的排查和分析工具

java 内存泄漏排查定位
1、首先 top查看 CPU 内存使用情况,发现过高。 垃圾回收频率过快,fullGC 频率过高
2、使用jmap命令导出head dump文件
3、使用JDK自带的VisualVM工具,查看dump文件,内存泄漏会有提示。
可以使用MAT 工具查看,同样会提醒内存泄漏相关代码 会列出内存占用列表,哪个类占内存用最多一目了然。

进程消耗的cpu高问题排查
1、top查找出哪个进程消耗的cpu高

top

2、根据进程号查找线程

top -H -p 5918

3、线程号转换16进制,jstack命令打印相关日志

// -A 100表示查找到所在行的后100行。5919用计算器转换为16进制171f,注意字母是小写。
jstack 5918 | grep -A 100 171f

一键查找问题脚本
show-busy-java-threads项目

posted @ 2022-02-18 16:22  倔强的老铁  阅读(246)  评论(0编辑  收藏  举报