jstack和jmap1
● Jps:是java提供的一个显示当前所有java进程pid的命令
● Jstat 命令:查看堆内存各部分的使用量和GC的情况。jstat -gc 进程id 可以查看GC日志
● Jstack命令:主要是用来查看java线程的堆栈信息,分析线程有没有死锁/死循环等,可以知道线程在做什么或等待什么
● Jmap:主要是用来dump java进程内存快照的,便于我们去分析内存中对象的存储情况
arthas :
启动:java -jar arthas-boot.jar ,然后选择attach哪个进程
分析cpu高 thread -n 3 -i 1000 (-n 找出当前最忙的线程 -i cpu占比采样间隔时间)
分析死锁 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
浙公网安备 33010602011771号