如何在glassfish v3中找到无限循环

时间:2013-04-30 15:15:06

标签: java-ee jpa java-ee-6 glassfish-3

我有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/

1 个答案:

答案 0 :(得分:2)

如果您拥有该机器的权限,则可以执行jstack

jstack在应用程序上执行线程转储。从那里你可以检查哪个线程处于无限循环中。

Jstackjdk捆绑在一起。

另一种方法是检查top命令(* nix)并启用线程视图。从那里你可以检查哪个线程正在消耗cpu。然后使用jstack,您可以看到nid,它是线程的十六进制值。

您可以使用jps获取java pid。