Java似乎挂了

萨塔尔·博塔(Sarel Botha):

我在自定义应用程序中使用Java Service包装器已经有一段时间了,并且运行良好。自从最近几天将应用程序更新到新版本以来,JVM开始挂起,然后包装器在日志中打印此内容:JVM似乎挂起:等待JVM发出的信号超时。

然后,它会自动终止JVM并再次启动该应用程序。运行约10个小时后就会发生这种情况,这使得调试变得更加困难。

当然,我将仔细研究我们所做的更改,但是没有进行任何重大更改,以至于我怀疑会导致这种类型的问题。

我在哪里可以尝试找出正在发生的事情?来自应用程序的调试消息并不表示任何有趣的东西。如果JVM刚刚崩溃,通常会创建一个转储,这可以帮助调试它,但是它挂起了,因此没有创建转储。如果我没有使它自动重新启动服务,那么在重新启动该服务之前,我能做些什么来使JVM中获得有用的信息吗?

在我看来,JVM不应因典型的编程错误而挂起。在此之前,您遇到了哪些问题,导致JVM挂起?

萨塔尔·博塔(Sarel Botha):

我在类路径(JBPM)上有几个不同版本的库。使用包装器,您可以使用通配符来包含jar。但是请务必谨慎,因为您可能会意外包含过多的内容。

这是一篇IBM文章,提供有关调试Java中挂起的信息它基本上说有两件事可能导致挂起:

  1. 无限循环
  2. 僵局。

从那时起,我不得不调试其他挂起的问题。在Linux上,您可以向JVM发送QUIT信号,以使其进行线程转储到控制台。这确实有助于找出问题所在。使用此命令执行此操作:kill -QUIT

编辑6/13/2017

这些天来,我使用JDK中包含的jmap转储程序的整个内存。然后,我使用Eclipse Memory Analyzer查看程序崩溃时的确切状态。您可以查看活动的线程列表,然后检查每个堆栈框架中的变量。

/usr/java/latest/bin/jmap -dump:file=/tmp/app-crash.hprof <PID>

PID是Java进程的进程ID。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章