Java-JVM-CPU使用率达到100%
作者:互联网
我有一个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
解决方法:
重现您的问题,当您看到CPU饱和时,请在Java进程上执行JSTACK转储,并使用OS实用程序捕获Process CPU及其线程CPU故障(Linux中为ps -L).您实际上应该设置一个脚本,以大约10或20倍1秒的间隔进行采样.
此后,如果您在Linux上运行,则可以将LWPid与JSTACK输出交叉引用,只需将LWPID从ps -L转换为十六进制,那么您应该很好地进行JSTACK的输出.
此时,您将清楚了解应用程序上的CPU消耗量.
如果问题出在GC上,那么您将看到GC线程在占用CPU,这时JConsole将有助于确定更多的根本原因.否则,您会清楚地注意到是谁造成了CPU消耗,您可以采取相应的措施.
附言我的示例在linux上,如果您未在运行linux,则可以通过谷歌找到获取进程CPU故障转储的方法.
让我知道您发现了什么.
标签:performance,java,garbage-collection 来源: https://codeday.me/bug/20191122/2062121.html