我在自定义应用程序中使用Java服务包装器已经有一段时间了,它一直运行得很好。由于在最近几天将应用程序更新到新版本,JVM开始挂起,然后包装器在日志中打印以下内容: JVM显示挂起:超时等待来自JVM的信号。
然后,它会自动终止JVM并再次启动应用程序。这发生在大约10小时的运行之后,这只会增加调试的难度。
当然,我会检查我们所做的更改,但没有重大的更改,我怀疑是导致这种类型的问题。
我可以在哪里尝试并弄清楚发生了什么?来自应用程序的调试消息不会显示任何有趣的东西。如果JVM崩溃,它通常会创建一个转储,这可以帮助调试它,但它是挂起的,所以它不会创建转储。如果我设置为不自动重新启动服务,那么在重新启动JVM之前,我可以做些什么来从JVM中获取一些有用的信息呢?
在我看来,JVM不应该因为典型的编程错误而挂起。在此之前,您遇到过什么可能导致JVM挂起的问题?
发布于 2009-03-09 14:01:41
我在类路径上有两个不同版本的库(JBPM)。使用wrapper,您可以使用通配符来包含jars。不过,要注意这一点,因为您可能会意外地包含超过您应该包含的内容。
下面是一篇关于debugging hangs in Java的文章。它基本上是说有两件事会导致挂起:
从那时起,我不得不调试其他挂起的问题。在linux上,您可以向JVM发送退出信号,让它将线程转储到控制台。这确实有助于找出问题所在。使用以下命令: kill -QUIT
编辑2017年6月13日
现在,我使用JDK中包含的jmap来转储程序的全部内存。然后,我使用Eclipse Memory Analyzer查看程序崩溃时的确切状态。您可以查看活动线程的列表,然后检查每个堆栈帧中的变量。
/usr/java/latest/bin/jmap -dump:file=/tmp/app-crash.hprof <PID>其中PID是java进程的进程ID。
发布于 2009-03-01 21:55:10
在wrapper.ping.timeout property上阅读。包装器软件每隔一段时间就会与JVM进行通信,以确保它是活动的。如果由于某种原因导致通信失败,包装器会认为进程挂起并尝试重新启动它。
根据应用程序的体系结构,当包装器试图"ping“应用程序时,JVM可能正忙于处理其他事情。
发布于 2009-03-01 23:47:33
看看您是否可以使用Visual VM来查看发生了什么。让Visual VM全程监控应用程序,当它停止工作时,也许您可以确定哪里出了问题。
如果虚拟机挂起,您可以获得线程的状态...我认为在给定设置的情况下,Visual VM会比通常的ctrl-break组合键(或其他组合键)更容易。
(根据评论进行编辑)
试过这个。上一次挂起时,线程的数量和使用的内存量都很低,所以这两项都不会导致问题。不幸的是,在它挂起和包装器终止它之后,你不能得到一个线程转储。
有没有办法在没有包装器的情况下运行它来调试它?此外,如果您使用NetBeans分析器,它可能会在它停止时给您一个处理它的机会(我将在今天晚些时候检查,看看我是否可以发现这是否会有不同的行为)。
https://stackoverflow.com/questions/600604
复制相似问题