Sar*_*tha 6 java debugging hang java-service-wrapper
我一直在自定义应用程序中使用Java Service包装器已经有一段时间了,它一直运行良好.由于在最近几天将我们的应用程序更新到新版本,JVM开始挂起,然后包装器在日志中打印出来:JVM出现挂起:超时等待来自JVM的信号.
然后它会自动终止JVM并再次启动应用程序.这在大约10个小时的运行后发生,这使得调试变得更加困难.
当然,我将查看我们所做的更改,但没有做出重大更改,我怀疑是会导致此类问题.
我在哪里可以尝试找出发生了什么?来自应用程序的调试消息并不表示任何有趣的内容 如果JVM崩溃了,它通常会创建一个转储,这可以帮助调试它,但它是挂起的,所以它不会创建转储.如果我没有自动重启服务,我可以做些什么来重新启动它之前从JVM中获取一些有用的信息?
在我看来,JVM不应该挂起典型的编程错误.你之前遇到什么会导致JVM挂起?
阅读wrapper.ping.timeout属性.包装器软件经常与您的JVM通信,以确保它是活着的.如果该通信因任何原因而失败,则包装器会认为该进程已挂起并尝试重新启动它.
根据应用程序的架构方式,当包装器尝试"ping"它时,JVM可能正忙于处理其他内容.
我在类路径 (JBPM) 上有几个不同版本的库。使用包装器,您可以使用通配符来包含 jar。但要小心这一点,因为您可能会不小心包含超出应有的内容。
这是一篇 IBM 文章,提供了有关调试 Java 中挂起的信息。它基本上说有两种情况可能导致挂起:
从那时起,我不得不调试其他悬而未决的问题。在 Linux 上,您可以向 JVM 发送 QUIT 信号,使其将线程转储到控制台。这确实有助于找出问题所在。使用此命令来执行此操作:kill -QUIT
编辑 2017 年 6 月 13 日
这些天我使用JDK中包含的jmap来转储程序的整个内存。然后我使用 Eclipse Memory Analyzer 查看程序崩溃时的确切状态。您可以查看活动线程列表,然后检查每个堆栈帧中的变量。
/usr/java/latest/bin/jmap -dump:file=/tmp/app-crash.hprof <PID>
Run Code Online (Sandbox Code Playgroud)
其中PID是java进程的进程ID。