JVM 8 exit code -559038737 (0xDEADBEEF)

24

我升级到 Java 8 后,我的应用程序开始出现不确定性失败。它没有抛出异常或打印错误消息。它失败的唯一迹象是退出码为 -559038737。有人遇到过这种情况吗?


15
如果你读取这个十六进制信息,它会显示“dead beef”。这是内存分析工具用来指示无效内存的常见技巧。 - Sergey Kalinichenko
3
OP,你的应用程序可能实际上在第三方代码中某个地方调用了System.exit(0xDEADBEEF) - Marko Topolnik
2
@MarkoTopolnik 如果我找到那个使用System.exit的库作者,我会杀了他。我想我可以尝试在该函数上设置断点。在Java源代码中使用那个魔数似乎比在C中使用更奇怪。 - Aleksandr Dubinsky
5
记录一下,OXCAFEBABE 在 JVM 环境中似乎更受欢迎。 - Totoro
2
@Totoro 每个有效的Java .class文件的前4个字节都是0xCAFEBABE。 - Jeff Scott Brown
显示剩余13条评论
1个回答

4

那个退出码可能来自于Apache Commons Exec

public interface Executor {

/** Invalid exit code. */
int INVALID_EXITVALUE = 0xdeadbeef;
...

Java 8 中有一些更改可能引入了错误。

但是如果不知道您的类路径和代码,这只是一种有根据的猜测。

也许您正在使用异步方式使用Commons Exec:

DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();

Executor executor = new DefaultExecutor();
executor.execute(cmdLine, resultHandler);

int exitValue = resultHandler.waitFor();

return exitValue;

所以异常只在resultHandler中被捕获,而不会自动打印到stderr上?

我使用Commons Exec来启动JVM进程。您认为JVM崩溃会导致Exec返回此退出代码,但不捕获JVM打印的错误输出吗?我在Java 8中看到了类似的问题,当被调用的java应用程序使用System.Exit()时,stderr输出没有被记录。然而,未处理异常的堆栈跟踪输出似乎会被记录。 - Aleksandr Dubinsky
我编辑了答案以回答该问题,也许您正在使用非阻塞方式来使用该库,这种方式不会自动打印堆栈跟踪。 - DiegoG
System.exit() 上看不到(某些)stderr输出(或者stdout)并不令人惊讶,因为输出缓冲区不会被刷新,或者在某些JVM上可能不会被刷新。 - Lawrence Dol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接