【问题标题】:JVM - Goes 100% CPU usageJVM - 达到 100% 的 CPU 使用率
【发布时间】:2013-09-20 06:25:34
【问题描述】:

我有一个 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

【问题讨论】:

  • 使用jstack 获取堆栈转储以查看那里发生了什么。一段时间后 100% 的使用率会下降吗?
  • 然后获取 jstack 输出。
  • 你能用一个可以在你的帖子中展示的简单程序重现这个问题吗?你是否监控 GC(使用 verbose:gc)?
  • 如果你停止程序执行,cpu 是否会在正常性能下下降?
  • 那么看起来你的代码有问题。那是一个不再移动的应用程序线程,对吧?

标签: java performance garbage-collection


【解决方案1】:

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

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

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

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

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

请告诉我你发现了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2013-06-30
    • 2015-07-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2020-10-06
    相关资源
    最近更新 更多