【发布时间】:2015-10-10 01:39:51
【问题描述】:
今天发现我的服务器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命令打印转储信息。如"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就正常了!
这是我的问题:
- 为什么
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]
【问题讨论】:
-
对于 Java 7 来说,关闭并行 GC 就成功了:
-XX:-UseParallelGC. -
@rsutormin - Voodoo GC 调整 ....
-
你使用什么操作系统、java版本和CPU?在您使用
jstack -F之前,我是否正确理解该进程一直停留在 GC 中? -
@the8472,
Linux version 2.6.32-504.el6.x86_64,32 Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz,jdk1.8.0_60.是的,我的应用程序恢复正常,直到我使用jstack -F -
奇怪的是,如果是
futex_wait错误导致它,关闭并行 GC 可能确实可行。
标签: java garbage-collection jstack