排查解决java进程占用系统内存高

/ 技术 / 无站内评论 / 176浏览

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

top

获取java的PID


或者

jps -l
jps -v



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

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

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

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




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

printf "%x\n"  12494

 结果 30ce



查看线程占内存信息


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

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



	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查询也行


相关命令

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占用高的线程排序


参考资料

java进程占用系统内存高,排查方法

23 高手是怎么使用jstack精确找到异常代码的


java进程占用系统内存高,排查解决

查看java进程内存简单示例

召唤蕾姆
琼ICP备18000156号

鄂公网安备 42011502000211号