来自 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()
而不是仅仅依赖 JPanel
的 dispose()
时,我遇到了这个问题。我很高兴我不必乱用 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 Tests
和 Run 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 异常退出”错误的主要内容,如果未能解决你的问题,请参考以下文章