来自 junit 测试的“分叉 Java VM 异常退出”错误

Posted

技术标签:

【中文标题】来自 junit 测试的“分叉 Java VM 异常退出”错误【英文标题】:"Forked Java VM exited abnormally" error from junit tests 【发布时间】:2010-12-23 05:04:46 【问题描述】:

我有一个在开发机器上单独运行时通过的 java junit 测试。我们还有一个 hudson 作业,它在带有 Java 1.5 的 Mac OS X 10.4 节点上运行所有测试,通过 ant 调用。直到最近,该测试才在 hudson 构建中通过,但现在(没有相关的代码更改)每次测试都失败,并出现以下错误:

错误信息

分叉的 Java VM 异常退出。 请注意报告中的时间 不反映直到 VM 的时间 退出。

堆栈跟踪

junit.framework.AssertionFailedError: 分叉的 Java VM 异常退出。 请注意报告中的时间 不反映直到 VM 的时间 退出。

谷歌搜索显示许多其他人似乎遇到了同样的问题,但我找不到任何答案。

【问题讨论】:

也许提供完整的堆栈跟踪。 Pascal:没有完整的堆栈跟踪。我仍然没有找到答案,但我们通过将 hudson 作业移至运行 OS X 10.5 和 Java 1.6 的不同 Mac 来解决这个问题。此设置不会出现问题。 那个项目不会碰巧在使用 JMock,声明了 javaagent 参数,对吧? @Zefi 不,它没有使用 JMOck 它是如何解决的?以下哪个是正确答案? 【参考方案1】:

我遇到了类似的问题。我将 junit 测试作为 ant 任务运行。我添加了 showoutput="yes" ant junit 属性并运行了 ant junit 任务。然后它显示了导致分叉 jvm 退出的异常堆栈跟踪。

【讨论】:

【参考方案2】:

对我来说,是分叉 VM 中的“java.lang.OutOfMemoryError”(带有 fork="yes" 的 junit 任务)导致此消息出现在主 VM 中。

OutOfMemory 在 ant 日志中可见(嗯,可见,因为它仍然存在)。

我用的是ant 1.7.1,所以升级ant没希望了。

在“运行>外部工具>外部工具>JRE”中放入与Eclipse.ini(-Xms40m -Xmx512m -XX:MaxPermSize=256M)相同的VM参数后,问题就解决了。

我将 fork 设置为“否”以确保 ant 使用参数。

【讨论】:

另一种让分叉的 junit 进程访问更多内存的方法(这里详述:ant.apache.org/manual/Tasks/junit.html)是在 junit ant 任务上使用 maxmemory 属性。 eclipse就是这样,用ANT运行时我们能做什么?【参考方案3】:

我相信当我最终在我的类路径中使用多个版本的 junit 时,我曾经看到过这个错误。可能值得一试。

【讨论】:

【参考方案4】:

当抛出未捕获的 RuntimeException 时,可能会发生这种情况。不幸的是,junit ant 任务不输出异常,因此没有简单的方法来确定根本原因。您可以通过从将显示异常的命令行运行测试用例来解决此问题。

java <vm-args> org.junit.runner.JUnitCore <test-class-name>

在我的例子中,抛出了 IllegalArgumentException。

【讨论】:

【参考方案5】:

我遇到了这个问题,事实证明该进程实际上是在调用 System.exit()。然而,Ant 中也有一个错误,有时会出现这种情况。我认为 Ant 1.7.1 修复了这个错误。因此,请确保您正在运行该版本。

【讨论】:

谢谢。当我向 File -> Close 添加条件 System.exit() 而不是仅仅依赖 JPaneldispose() 时,我遇到了这个问题。我很高兴我不必乱用 Ant 或日志文件。【参考方案6】:

虚拟机崩溃了吗?你能找到一个转储文件(称为hs_err_pid*.log)吗?如果是这种情况,转储文件将为您提供崩溃原因的线索。

【讨论】:

【参考方案7】:

前段时间我也有同样的事情。问题是 System.exit() 在某处被调用。但可能很难找到,因为调用可能来自您的代码或您使用的库之一。

【讨论】:

谁发布了一个调用 System.exit() 的通用库,需要被追捕和枪杀。【参考方案8】:

我的类路径中有多个 junit jar。一个来自 ant,另一个来自 WAS。当我删除错误消失时...我使用的 Ant 版本 1.8

【讨论】:

【参考方案9】:

我通过设置以下环境变量解决了我的问题:

变量:_JAVA_OPTIONS 值:-Xms128m -Xmx512m

【讨论】:

【参考方案10】:

对我们来说,实际上是我们偶然(使用了较新版本的 eclipse)开始使用 Ant 1.7.x 而不是与我们的 Weblogic 8.1/JDK 1.4.x 环境兼容的旧 ant 版本。我们通过将 Eclipse->Windows->Preferences->Ant->Runtime 中的 Ant Home 改回旧版本的 Ant 来解决此问题。

问候 克拉斯

【讨论】:

【参考方案11】:

在我的情况下,这是一个类内的静态初始化程序/方法/块中的未捕获异常。

具体来说,我有一个类调用另一个类中的静态方法,它触发了 NumberFormatException。

顺便说一句,将“showoutput=true”添加到 build.xml 中的任务并没有帮助解决问题。由于静态块是最先运行的东西之一,因此 JVM 在它可以输出任何东西之前就崩溃了。

【讨论】:

【参考方案12】:

我也有这个问题。从以下位置更改 junit 任务:

<batchtest fork="yes" ... /> 

<batchtest fork="no" ... /> 

为我修好了。我不完全理解蚂蚁的这个领域,或者为什么这样做会解决它。在我的场景中,这是“BeforeFirstTest”中的一个错误,我认为它会因为我的类路径中有两个 ant 文件而出错(这可能是我应该修复的)

我认为问题在于 ant 的一个版本: http://track.pmease.com/browse/QB-500;jsessionid=C1CF6999CBBDB5097A9CFCF4A11AF6C0?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

ETA:我认为 batchtest="no" 实际上会更改类路径,因此会排除我的违规 ant jar。

【讨论】:

【参考方案13】:

我将TestNG 库添加到测试库,它解决了这个问题。

【讨论】:

【参考方案14】:

在我的例子中,运行我的测试的类路径超过了操作系统允许的环境变量的最大长度(又名the Linux Classpath too long issue).

解决方案是创建一个pathing jar。简化步骤:

    使用 jar(或您的 IDE)为您的项目制作一个 jar,我们将其命名为 MyProject.jar

    使用文本创建一个名为 Manifest.txt 的文件

类路径:MyProject.jar

    运行jar命令行这个

jar cfm PathingJar.jar manifest.txt MyRootPackage/*.class

然后,在您的构建工具中,针对路径 jar 本身运行您的测试指令(不要混入其他类或 jar)。然后我就可以让我的测试在没有那个异常的情况下运行。

【讨论】:

【参考方案15】:

我在 Jenkins 上运行测试时遇到了类似的问题,相同的测试在本地通过。

我可以通过将日志级别设置为 WARN 来解决问题

【讨论】:

【参考方案16】:

在将新版本的 NetBeans 重新安装到外部硬盘、同时升级 Junit 并使用我的旧工作区后,我遇到了这个问题。

对我来说,解决同样的问题很简单:

只需将 JUnit-Library 添加到项目 properties => Libraries => Compile TestsRun Tests

所以,就我而言,这只是缺少库或 JUnit 版本冲突。

【讨论】:

【参考方案17】:

我遇到了同样的问题。问题在于通过模拟 Config 类生成字节码;我们将导入更改为

import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

它成功了。

【讨论】:

以上是关于来自 junit 测试的“分叉 Java VM 异常退出”错误的主要内容,如果未能解决你的问题,请参考以下文章

当您尝试对其运行 JUnit 测试时,不会为独立应用程序加载来自“application.yml”的属性

单元测试JUnit

TestNG单元测试

如何从命令行运行 JUnit 测试用例

Junit

Gradle 没有找到我使用 Kotlin 和 JUnit 5 进行的测试