排查解决java进程占用系统内存高
in 技术 with 0 comment

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

in 技术 with 0 comment

使用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进程内存简单示例