jstack和jmap1
● Jps:是java提供的一个显示当前所有java进程pid的命令
● Jstat 命令:查看堆内存各部分的使用量和GC的情况。jstat -gc 进程id 可以查看GC日志
● Jstack命令:主要是用来查看java线程的堆栈信息,分析线程有没有死锁,比如下面的这个两个线程互相等待对方释放锁而产生的死锁信息
● Jmap:主要是用来dump java进程内存快照的,便于我们去分析内存中对象的存储情况
arthas :
分析死锁 thread b
分析慢执行 trace 类路径 方法名 '#cost>时间(ms)'
内存文件分析工具:
● MemoryAnalyzer:这是一款Eclipse提供的内存分析工具,可以结合Eclipse使用,也可独立使用
● JProfiler,:这是由ej-technologies GmbH公司开发的一款内存分析工具,可以结合IDEA使用
● Jconsole:是一个用java写的GUI程序,用来监控VM,并可监控远程的VM
留存内存文件有两种方式:
1.是配置jvm启动参数: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=xxxx(文件导出路径),JVM发生OOM时,自动生成dump文件;
2.是采用jmap命令,手动进行内存dump。
JVM内存溢出问题排查-腾讯云开发者社区-腾讯云 (tencent.com)
一.分析cpu过高场景
1. top找出cpu占用高的进程pid ,按P键排序
2. top -Hp pid 查看cpu占用率高的线程
3. printf "%x\n" 153586 将线程id转换16进制打印
4. jstack -l 进程id
a.打印出堆栈信息,分析线程有没有死锁 。 调用链多的可以用 Arthas thread b 命令查看死锁线程
b.如果是GC线程,则有可能发生了内存泄漏或溢出
5.jmap -dump:file=dump.hprof 进程id 导出dump文件,使用内存文件分析工具
6.导入dump文件,导入后有各种详细的展示视图。比如大对象,数量多的对象,泄露猜测等。
7.排查代码
cpu过高原因:
1.死循环或长时间执行的方法
2. 过度使用线程,大量线程频繁切换
3.内存泄漏,频繁GC
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步