Java JVM—CPU使用率达到100%
我有一个Java程序,它在某个时候会变成100%的CPU使用率和睡眠状态。该程序不是多线程的 环顾四周,我认为最有可能的原因是一个bug或者我运行java解释器的方式与垃圾收集不匹配。我只能认为100%的CPU使用率是因为GC。我正在为程序分配足够的内存,以便使用Xmx运行,而程序的运行量甚至没有接近我分配的内存量。我分配的内存量也远小于机器上可用的总内存 我发现: stackoverflow.com上也提到了这一点,如: 不过,我还是找不到解决办法。这是JVM中的错误吗?如果是,我将如何修复它 编辑:Java JVM—CPU使用率达到100%,java,performance,garbage-collection,Java,Performance,Garbage Collection,我有一个Java程序,它在某个时候会变成100%的CPU使用率和睡眠状态。该程序不是多线程的 环顾四周,我认为最有可能的原因是一个bug或者我运行java解释器的方式与垃圾收集不匹配。我只能认为100%的CPU使用率是因为GC。我正在为程序分配足够的内存,以便使用Xmx运行,而程序的运行量甚至没有接近我分配的内存量。我分配的内存量也远小于机器上可用的总内存 我发现: stackoverflow.com上也提到了这一点,如: 不过,我还是找不到解决办法。这是JVM中的错误吗?如果是,我将如何修
我在这里添加了jstack输出的粘贴:重现您的问题,当您看到CPU饱和时,在Java进程上执行jstack转储,并使用OS实用程序捕获进程CPU及其线程CPU故障(linux中的ps-L)。实际上,您应该设置一个脚本,以10或20倍1秒的间隔进行采样 之后,如果您在linux上运行,您可以将LWPid与JSTACK输出交叉引用,只需将LWPid从ps-L转换为hex,就可以继续JSTACK的输出 在这一点上,你将得到一个关于什么是你的应用程序消耗CPU的清晰想法 如果GC是问题所在,那么您将看到GC线程占用CPU,此时JConsole将有助于确定进一步的根本原因。否则,您将清楚地注意到谁负责CPU消耗,您可以相应地采取行动 另外,我的例子是在linux上,如果你没有运行linux,你可以通过谷歌找到方法来获得进程CPU故障转储
一定要让我知道你发现了什么。使用
jstack
获取堆栈转储,看看那里发生了什么。100%的使用率会在一段时间后下降吗?然后获得jstack输出。你能用一个简单的程序重现这个问题吗?你能在你的帖子中展示这个问题吗?您是否监视GC(使用verbose:GC)?如果停止程序执行,cpu是否会以正常性能下降?那么您的代码中似乎存在一些问题。这是一个不再运行的应用程序线程,对吗?