我有s.t.像一个无限循环一些在代码中的位置。那个地方不经常被称为。因此,几个小时后,Linux机器上的一个CPU开始以100%运行,然后一段时间再运行一个等等。 重启服务器可以解决问题一段时间。
我怎样才能找到发生这种情况的地方?
我考虑过将RequestTimeout设置得非常小。 (5分钟)我会在日志中收到正确的错误消息,告诉我出了什么问题。
顶部带有命令“H”
16639 java 20 0 9836m 2.6g 17m R 100 16.5 39:55.33 java 18059 java 20 0 2745m 2.3g 17m S 2 14.5 0:00.92 java 16591 java 20 0 9836m 2.6g 17m S 1 16.5 0:15.97 java 5307 java 20 0 8945m 4.6g 3864 S 1 29.1 746:47.67 java
然后: jstack -J-d64 16639
但我明白了: 16639:无法打开套接字文件:目标进程未响应或未加载HotSpot VM 当目标进程没有响应时,可以使用-F选项
我必须从头开始在机器上?
关于如何搜索热点的好文章:
http://code.nomad-labs.com/2010/11/18/identifying-which-java-thread-is-consuming-most-cpu/
答案 0 :(得分:2)
如果您拥有该机器的权限,则可以执行jstack
。
jstack
在应用程序上执行线程转储。从那里你可以检查哪个线程处于无限循环中。
Jstack与jdk
捆绑在一起。
另一种方法是检查top
命令(* nix)并启用线程视图。从那里你可以检查哪个线程正在消耗cpu。然后使用jstack
,您可以看到nid
,它是线程的十六进制值。
您可以使用jps
获取java pid。