今天,我发现我的服务器的cpu负载太高,并且服务器只运行一个Java应用程序。
下面是我的操作步骤。
I used top
命令查找应用程序的 pid。 pid是25713。
I used top -H -p 25713
命令查找一些使用最多 cpu 的 pid。例如25719 tomcat 20 0 10.6g 1.5g 13m R 97.8 4.7 314:35.22 java
.
I used jstack -F 25713
命令打印转储信息。例如"Gang worker#4 (Parallel GC Threads)" os_prio=0 tid=0x00007f5f10021800 nid=0x6477 runnable
我从转储文件中搜索了 pid。然后我发现占用CPU最多的pid都是这样的"Gang worker#4 (Parallel GC Threads)" os_prio=0 tid=0x00007f5f10021800 nid=0x6477 runnable
我使用后jstack
命令,然后cpu就正常了!
这是我的问题:
- Why
GC Threads
导致cpu负载过高。
- 为什么我用了之后
jstack
命令cpu变得正常。
不止这一次,每一次。
这是一些正常的日志。2015-10-10T10:17:52.019+0800: 71128.973: [GC (Allocation Failure) 2015-10-10T10:17:52.019+0800: 71128.973: [ParNew: 309991K->206K(348416K), 0.0051145 secs] 616178K->306393K(1009920K), 0.0052406 secs] [Times: user=0.09 sys=0.00, real=0.01 secs]
当CPU过高时,GC日志停留在[GC (Allocation Failure) 2015-10-10T10:18:10.564+0800: 71147.518: [ParNew:
,并且没有其他日志。
当我执行时jstack
命令,打印日志
2015-10-10T10:17:50.757+0800: 53501.137: [GC (Allocation Failure) 2015-10-10T10:17:50.757+0800: 53501.137: [ParNew: 210022K->245K(235968K), 369.6907808 secs] 400188K->1
90410K(1022400K), 369.6909604 secs] [Times: user=3475.15 sys=11.69, real=369.63 secs]
只是猜测,你might受到影响futex_wait 错误 https://groups.google.com/forum/#!topic/mechanical-sympathy/QbmpZxp6C64存在于某些内核版本中。
更普遍,jstack -F
向进程发送一个信号,这将中断任何可能正在休眠的线程。因此,GC 线程可能只是在旋转等待另一个不知何故错过唤醒的线程。 IE。如果它确实卡在 GC 中并且发送信号解决了问题,那么这可能表明存在锁定或内存排序错误(如果不是在内核中,则在 JVM 中)。
而不是使用jstack -F
你可以尝试发送SIGBREAK
到这个过程,看看是否有同样的效果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)