type
status
date
slug
summary
tags
category
icon
password
URL

前置启动程序

事先启动一个web应用程序,用jps查看其进程id,接着用各种jdk自带命令优化应用

Jmap

此命令可以用来查看内存信息,实例个数以及占用内存大小
notion image
 
堆信息
notion image
堆内存dump
也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)
  • XX:+HeapDumpOnOutOfMemoryError
  • XX:HeapDumpPath=./ (路径)
可以用jvisualvm命令工具导入该dump文件分析
notion image
 
Jstack
jstack找出占用cpu最高的线程堆栈信息
  1. 使用命令top -p <pid> ,显示你的java进程的内存情况,pid是你的java进程号,比如19663
notion image
  1. 按H,获取每个线程的内存情况
notion image
  1. 找到内存和cpu占用最高的线程tid,比如19664
  1. 转为十六进制得到 0x4cd0,此为线程id的十六进制表示
  1. 执行 jstack 19663|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调用方法
  1. 查看对应的堆栈信息找出可能存在问题的代码

Jinfo

查看正在运行的Java应用程序的扩展参数
查看jvm的参数
 

Jstat

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]
注意:使用的jdk版本是jdk8
 

垃圾回收统计

jstat -gc pid 最常用,可以评估程序内存使用及GC压力整体情况
notion image
 
 

项目中服务器频繁gc解决

notion image
通过jstat 命令可以发现每分钟full gc 接近10次了
通过pingpoint 发现线 inbox/supplyChain/noRead 调用非常频繁 初步怀疑是这个问题
查看阿里云日志和gc 时间刚好匹配上,猜就是这个接口的问题
 
notion image
 

在开发服务器进行重现

notion image
 
线上大概是1分钟请求1000次 在开发用jmeter 压测 却发现gc 是正常
 

查询最大cpu线程

  1. 使用top 命令 获取cpu 最高的进程
notion image
  1. 从cpu占用情况基本可以排除,不过实际dump文件需要运维帮忙处理所以这个地方算是做下确认
  1. top -p 按H 获取每个线程具体情况
notion image
  1. 将cpu 高的线程id 转16进制 并使用jstack 分析 但是最后发现cpu 高的线程是 gc concurrent mark-sweep gc thread
notion image
 

堆内存dump

jmap -dump\:format=b,file=gc.hprof 5041
找运维帮忙下载了dump,开始使用jdk 自带的 jvisualvm 工具分析
notion image
 
只能分析有可能和mysql 有关 但是无法找到具体原因

使用MAT工具重新分析堆内存dump

后面在google问题时发现更好用的Mat 重新分析dump 文件
notion image
 
Dominator Tree是在对象实例的角度上进行分析,注重引用关系分析
notion image
 
找出对应的sql:
SELECT count(1) FROM inbox\_message\_user\_relation WHERE is\_deleted = 0 AND inbox\_msg\_id IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
这里太长了就不全复制了,通过查找sql对应的出处确认了是inbox/supplyChain/noRead方法中的子方法,然后通过加缓存和更新查询逻辑解决了问题
 
 
致谢:
💡
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
 
 
垃圾收集器和三色标记算法spring
Loading...