【问题标题】:"Forked Java VM exited abnormally" error from junit tests来自 junit 测试的“分叉 Java VM 异常退出”错误
【发布时间】: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
  • 它是如何解决的?以下哪个是正确答案?

标签: java ant junit hudson


【解决方案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。简化步骤:

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

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

                      类路径:MyProject.jar

                      1. 运行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;
                            

                            它成功了。

                            【讨论】:

                              猜你喜欢
                              • 2013-03-06
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2010-12-22
                              • 1970-01-01
                              • 1970-01-01
                              • 2012-02-06
                              相关资源
                              最近更新 更多