今天,我发现我的服务器的CPU负载过高,并且服务器只运行了一个Java应用程序。
以下是我的操作步骤:
当我执行
以下是我的操作步骤:
- 使用
top
命令查找应用程序的pid。 pid为25713。 - 使用
top -H -p 25713
命令查找使用最多CPU的一些pid。例如25719 tomcat 20 0 10.6g 1.5g 13m R 97.8 4.7 314:35.22 java
。 - 使用
jstack -F 25713
命令打印dump信息。例如"Gang worker#4 (Parallel GC Threads)" os_prio=0 tid=0x00007f5f10021800 nid=0x6477 runnable
- 从dump文件中搜索pid。然后我发现使用大部分CPU的pid都类似于
"Gang worker#4 (Parallel GC Threads)" os_prio=0 tid=0x00007f5f10021800 nid=0x6477 runnable
- 使用
jstack
命令后,CPU负载恢复正常!
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]
-XX:-UseParallelGC
。 - rsutorminjstack -F
命令? - the8472futex_wait
错误导致的问题,关闭并行GC可能确实可行。 - biziclop