type
status
date
slug
summary
tags
category
icon
password
URL
前置启动程序
事先启动一个web应用程序,用jps查看其进程id,接着用各种jdk自带命令优化应用
Jmap
此命令可以用来查看内存信息,实例个数以及占用内存大小

堆信息

堆内存dump
也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)
- XX:+HeapDumpOnOutOfMemoryError
- XX:HeapDumpPath=./ (路径)
可以用jvisualvm命令工具导入该dump文件分析

Jstack
jstack找出占用cpu最高的线程堆栈信息
- 使用命令top -p <pid> ,显示你的java进程的内存情况,pid是你的java进程号,比如19663

- 按H,获取每个线程的内存情况

- 找到内存和cpu占用最高的线程tid,比如19664
- 转为十六进制得到 0x4cd0,此为线程id的十六进制表示
- 执行 jstack 19663|grep -A 10 4cd0,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,从堆栈中可以发现导致cpu飙高的调用方法
- 查看对应的堆栈信息找出可能存在问题的代码
Jinfo
查看正在运行的Java应用程序的扩展参数
查看jvm的参数
Jstat
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]
注意:使用的jdk版本是jdk8
垃圾回收统计
jstat -gc pid 最常用,可以评估程序内存使用及GC压力整体情况

项目中服务器频繁gc解决

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

在开发服务器进行重现

线上大概是1分钟请求1000次 在开发用jmeter 压测 却发现gc 是正常
查询最大cpu线程
- 使用top 命令 获取cpu 最高的进程

- 从cpu占用情况基本可以排除,不过实际dump文件需要运维帮忙处理所以这个地方算是做下确认
- top -p 按H 获取每个线程具体情况

- 将cpu 高的线程id 转16进制 并使用jstack 分析 但是最后发现cpu 高的线程是 gc concurrent mark-sweep gc thread

堆内存dump
jmap -dump\:format=b,file=gc.hprof 5041
找运维帮忙下载了dump,开始使用jdk 自带的 jvisualvm 工具分析

只能分析有可能和mysql 有关 但是无法找到具体原因
使用MAT工具重新分析堆内存dump
后面在google问题时发现更好用的Mat 重新分析dump 文件

Dominator Tree是在对象实例的角度上进行分析,注重引用关系分析

找出对应的sql:
SELECT count(1) FROM inbox\_message\_user\_relation WHERE is\_deleted = 0 AND inbox\_msg\_id IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
这里太长了就不全复制了,通过查找sql对应的出处确认了是inbox/supplyChain/noRead方法中的子方法,然后通过加缓存和更新查询逻辑解决了问题
致谢:
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
- 作者:卷神
- 链接:https://blog.952712.xyz/article/ac2f50a9-478e-4f58-87c1-f4f79c417284
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。





