如何确定是什么关闭了我的 Java 应用程序?

问题描述 投票:0回答:2

我有一个在 RHEL 6.10 上运行的 Java8 应用程序。该应用程序通过通常的方法注册一个关闭处理程序:

Thread shutdownThread = new Thread(()=>{
   Logger.info("Got shutdown signal");
   // Do cleanup
});
Runtime.getRuntime().addShutdownHook(shutdownThread);

此应用程序由 Jenkins 构建启动(将

BUILD_ID
环境变量设置为
dontkillme
)。应用程序初始化成功,但大约 30 秒后,关闭挂钩被调用并且应用程序终止。我试图找出谁在阻止我以及为什么。我已经监控过
top
并且在运行时内存似乎不是问题,所以我不认为 OOM 杀手是罪魁祸首。我还查看了
/var/log/dmesg
/var/log/messages
,但也没有看到任何相关内容。我不认为 Jenkins 会杀了我,因为我设置了
BUILD_ID
,也因为应用程序在“父”Jenkins 作业仍在运行时终止了。

我还可以使用哪些其他方法/工具来查看正在发生的情况?请注意,我的环境非常锁定,因此很难从互联网上下载并运行某些内容,希望标准 RHEL6 安装中有一些我可以使用的内容。

java jenkins java-8 rhel rhel6
2个回答
0
投票

事实证明,答案对于相关应用程序来说是唯一的。该应用程序使用zookeeper-3.5.5库连接到Zookeeper实例。该客户端库在运行时依赖于 Zookeeper-jute jar,当执行目录中不存在该 jar 时,就会出现此问题。

您可能想知道为什么应用程序会默默地自行关闭并且没有抛出 ClassNotFoundException ,这可以帮助我调试它。好问题!我不知道。


0
投票

用户线程使 JVM 保持活动状态。一旦不再有活动的用户线程,您的 JVM 将终止。

这意味着,正如许多初学者程序员可能会忽略的那样,它不是保持应用程序运行的主要方法。 main 方法就是应用程序启动的地方。您可以在主方法中启动各种线程来执行实际工作,然后离开主方法。只要这些线程还活着,您的应用程序就会继续执行。

© www.soinside.com 2019 - 2024. All rights reserved.