Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM—CPU使用率达到100%_Java_Performance_Garbage Collection - Fatal编程技术网

Java JVM—CPU使用率达到100%

Java JVM—CPU使用率达到100%,java,performance,garbage-collection,Java,Performance,Garbage Collection,我有一个Java程序,它在某个时候会变成100%的CPU使用率和睡眠状态。该程序不是多线程的 环顾四周,我认为最有可能的原因是一个bug或者我运行java解释器的方式与垃圾收集不匹配。我只能认为100%的CPU使用率是因为GC。我正在为程序分配足够的内存,以便使用Xmx运行,而程序的运行量甚至没有接近我分配的内存量。我分配的内存量也远小于机器上可用的总内存 我发现: stackoverflow.com上也提到了这一点,如: 不过,我还是找不到解决办法。这是JVM中的错误吗?如果是,我将如何修

我有一个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是否会以正常性能下降?那么您的代码中似乎存在一些问题。这是一个不再运行的应用程序线程,对吗?