java导致系统满载_排查解决java进程占用系统内存高

本文介绍了如何排查Java进程导致的系统满载问题。通过`top`、`jps`、`ps`和`jstack`命令,找出CPU利用率高的线程,分析线程状态,如WAITING和TIMED_WAITING,以及可能的原因,如线程等待条件或调用sleep。还提到了相关JVM诊断工具的使用,如`jps`、`jstat`、`jinfo`、`jmap`、`jhat`和`jstack`,帮助优化Java应用程序的性能。
摘要由CSDN通过智能技术生成

使用top命令查看系统资源的使用情况

top

获取java的PID

a64c9d05a8caea08400abc3ab341a051.png

或者

jps -l

jps -v

7a5c862e0a016b29e332d2f338ac0e7d.png

通过命令查看进程的线程情况

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

找到以下进程中,CPU利用率比较高的线程号TID(十进制数),此处为12394

接下来就可以通过jstack查看内存使用的堆栈。

8b988839d4b9075fc744d554ba76c575.png

将获取的线程号PID(十进制数)转换成十六进制

printf "%x\n"  12494

结果 30ce

9222a038b3614a8da1d92dc890d62185.png

查看线程占内存信息

jstack pid |grep 16进制的线程id -a10

-a10的作用额外显示上下10行

c4cf44a13db8ed41434f3bfad90c716a.png

**at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

at java.lang.Thread.run(Thread.java:748)

"Timer-1" #27 prio=5 os_prio=0 tid=0x00007fcc502082e0 nid=0x30e3 in Object.wait() [0x00007fcc58fa7000]

java.lang.Thread.State: TIMED_WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

at java.util.TimerThread.mainLoop(Timer.java:552)

- locked <0x00000000f5f21658> (a java.util.TaskQueue)

at java.util.TimerThread.run(Timer.java:505) "MVStore background writer nio:/root/solo_h2/db.mv.db" #23 daemon prio=5 os_prio=0 tid=0x00007fcc7cacbb20 nid=0x30ce in Object.wait() [0x00007fcc592a8000]

java.lang.Thread.State: TIMED_WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

at org.h2.mvstore.MVStore$BackgroundWriterThread.run(MVStore.java:2684)

- locked <0x00000000f5ea6178> (a java.lang.Object) "Abandoned connection cleanup thread" #21 daemon prio=5 os_prio=0 tid=0x00007fcc7ca9bef0 nid=0x30cc in Object.wait() [0x00007fcc593a9000]

java.lang.Thread.State: TIMED_WAITING (on object monitor)

at java.lang.Object.wait(Native Method)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)

- locked <0x00000000f5e1c750> (a java.lang.ref.ReferenceQueue$Lock)**

可以看到这个线程状态为:WAITING。通过查看文件分析看到大量Java Thread State。

说明它在等待另一个条件的发生,来把自己唤醒,或者干脆它是调用了 sleep(N)。

此时线程状态大致为以下几种:

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

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

或者输出该进程的堆栈日志文件里

**jstack -l pid> jstack.log**

sz jstack.log 发送文件到桌面

再次使用十六进度ID查询也行

62098bffeafb31f19ec055d69293d5c9.png

相关命令

1、jps 显示指定系统内的所有JVM进程

2、jstat 收集JVM各方面的运行数据

3、jinfo  显示JVM配置信息

4、jmap  堆快照

5、jhat  分析headdump文件

6、jstack  显示JVM的线程快照

查看线程信息

ps -mp pid -o THREAD,tid,time|wc -l 查看线程数

ps -mp pid -o THREAD,tid,time | sort -rn | head -10 线程列表,并按照CPU占用高的线程排序

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值