JVM - 100%的CPU使用率

时间:2013-09-20 06:25:35

标签: java performance garbage-collection

我有一个Java程序,在某些时候会同时变成100%的CPU使用率和睡眠状态。该程序不是多线程的。

环顾四周,我认为最可能的原因是我在垃圾收集方面运行java解释器的方式存在错误或不匹配。我只能认为100%的CPU使用率是因为GC。我正在为程序分配足够的内存以使用Xmx运行,并且程序甚至在我分配的数量附近也不会运行。我分配的金额也远低于机器上可用的总内存。

我发现了这个:

http://code.google.com/p/spymemcached/issues/detail?id=279

在stackoverflow.com上也有一些提及,例如:

CMS garbage collector - when does it run?

但是,我找不到解决方案。这是JVM中的错误吗?如果是,我该如何解决?

编辑: 我在这里添加了一个jstack输出的粘贴:http://pastebin.com/Au0V9FCN

1 个答案:

答案 0 :(得分:3)

重现您的问题,当您看到CPU已饱和时,在Java进程上执行JSTACK转储并使用OS实用程序捕获进程CPU及其线程CPU崩溃(在Linux中为ps -L)。实际上,您应该设置一个脚本来执行大约10或20次1秒间隔采样。

在此之后,如果你在linux上运行,你可以使用JSTACK输出交叉引用LWPid,只需将LWPID从ps -L转换为hex,你就应该继续使用JSTACK的输出。

此时,您将清楚了解应用中消耗CPU的内容。

如果GC出现问题,那么您将看到GC线程占用CPU,此时JConsole将有助于确定更多根本原因。否则,您会清楚地注意到谁负责CPU消耗,您可以采取相应的行动。

P.S。我的例子是在linux上,如果你没有运行linux,你可以通过谷歌的方式获得进程CPU分解转储。

让我知道你发现了什么。