gpt4 book ai didi

Java应用程序悄无声息地死掉了,为什么?

转载 作者:行者123 更新时间:2023-12-02 04:14:09 26 4
gpt4 key购买 nike

我有一个 java 应用程序神秘地死掉了,日志中没有任何异常。我通过 bash script 在后台运行它它包装了一个 nohup,如下所示:

nohup java -Xms6g -Xmx6g -jar myapp.jar 2>> stderr.txt >> /dev/null & echo $! > /tmp/myapp-pid

java 应用程序占用大量内存,因此配置了 6GB 堆空间(在 64 位 JVM 上运行)。它正常运行大约 8 小时,然后默默地死掉。日志中没有任何异常,什么也没有。

应用程序从主方法进入无限 while 循环,轮询 AWS SQS 中的消息并处理它们。这一切都包含在 try-catch 中,我正在记录该 catch。应用程序似乎在完成 while 循环并记录最后一行后退出。例如该申请将始终以“成功处理”结束。

while(true) {
try {
// Logic to poll SQS and process the message
} catch (MyCustomException e) {
// Write to SQS dead letter queue (was throwing at this point)
// Delete message from original SQS
} catch (Throwable e) {
LOG.error(...);
} finally {
LOG.info("Processing time was...");
}
}

我不知道从哪里开始,因为我以为它会记录一些东西。任何人都可以提供一些指针或一些 JVM 设置来配置,以便我可以开始调查吗?

我想知道代码之外的东西是否可能导致错误。就像 JVM 崩溃一样?

更新看来这确实是一个编程错误。我不认为它导致了问题,所以我没有将其添加到上面的代码路径中(现在刚刚添加),但我确实有另一个 catch 子句捕获我创建的自定义异常。在该 catch 中,我试图将 SQS 消息移动到死信队列,但没有权限,因此将其抛出到我没有处理的 catch 中。

感谢所有帮助提出可能出现问题的人!

最佳答案

如果没有更多代码,很难说出实际发生的情况。但根据finally的定义,它总是被执行,这意味着在失败的情况下也是如此。也许您只是错过了之前编写的异常。尝试将 finally 调用移至“try” block 内。

while(true) {
try {
// Logic to poll SQS and process the message
LOG.info("Successfully processed");
} catch (Throwable e) {
//As mentioned in the comments try for debugging to log on info level here as well.
// Maybe error level is disabled (although this should be
//very unlikely since error normally is written too when info is written.
LOG.info(...);
} finally {
//Clean up.
}
}

这两个想法可以帮助您进一步调查您的问题。

关于Java应用程序悄无声息地死掉了,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33499250/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com