3

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

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

我找到了这个:

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

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

CMS 垃圾收集器 - 它何时运行?

尽管如此,我还是找不到解决方案。这是 JVM 中的错误,如果是,我将如何修复它?

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

4

1 回答 1

3

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

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

至此,您将清楚地了解应用程序中消耗 CPU 的内容。

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

PS 我的例子是在 linux 上的,如果你没有运行 linux,你可以用谷歌搜索获取进程 CPU 故障转储的方法。

请让我知道你发现了什么。

于 2013-09-22T05:42:33.870 回答