java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > 系统运维问题排查-java内存过高

系统运维问题排查-java内存过高分析及说明

作者:运维Math

本文总结了监控Java进程内存与线程状态的常用命令及参数,包括top排序、jmap查看内存分布、jstat分析GC数据、jstack解析线程状态等,强调需使用与进程一致的用户执行,并解析了线程状态和内存区域的含义

1、查看内存使用情况

使用top查看进程使用内存情况,shift+m让内存使用率按照降序排序,shift+p让cpu使用率按照降序排序。

2、查看某个进程的线程情况

ps p $pid -L -o pcpu,pmem,pid,tid,time,tname,cmd

3、执行 jmap $pid命令观察内存使用情况

4、执行 jstat -gcutil $pid 5s 命令查看内存使用情况

结果列含义:

5、执行 jmap –heap $pid 命令

查看各内存区域的设置

6、执行 jmap -histo:live $pid 命令

查看每个 class 的实例数目、内存使用率和类全名。每分钟执行一次,连续执行 5 次

7、获取dump文件

jmap -dump:live format=b,file=./dump.bin $pid

8、查看进程堆栈信息

jstack -l $pid> /usr/local/temp/jstack.log

JSTACK命令打印解析

日志格式

具体分析

waiting to lock <0x00000000d6349040>,即试图在地址为0x00000000d6349040所在的对象获取锁;而该对象却被线程加了锁(locked <0x00000000d6349040>)。

其中:java.lang.Thread.State: WAITING (parking):一直等那个条件发生;

java.lang.Thread.State: TIMED_WAITING (parking或sleeping):定时的,那个条件不到来,也将定时唤醒自己。MEM。

注意:jmap和jstack需要使用与进程一致的用户才能执行

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文