分叉的VM终止了,没有说再见。VM崩溃或System.exit被调用


191

请帮我解决这个问题。我不完全了解日志中的错误是什么意思。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 21.749s
[INFO] Finished at: Thu Apr 24 10:10:20 IST 2014
[INFO] Final Memory: 15M/37M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.15:test (default-test) on project samples.simpleforwarding: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.15:test failed: The forked VM terminated without saying properly goodbye. VM crash or System.exit called ?
[ERROR] Command wascmd.exe /X /C ""C:\Program Files\Java\jdk1.7.0_55\jre\bin\java" -Xmx1024m -XX:MaxPermSize=256m -jar E:\OpenDayLight\controller\opendaylight\samples\simpleforwarding\target\surefire\surefirebooter53410321571238933.jar E:\OpenDayLight\controller\opendaylight\samples\simpleforwarding\target\surefire\surefire86076271125218001tmp E:\OpenDayLight\controller\opendaylight\samples\simpleforwarding\target\surefire\surefire_01846991116135903536tmp"
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginExecutionException

7
请按照输出提示使用-e和-X重新运行Maven,然后粘贴它所提供的内容。另外,您是在构建自己的代码还是现有的库?如果要构建自己的代码,那么您在任何地方都调用System.exit(int)吗?如果您正在构建现有库,那么您从哪里获得资源?
Dylon

@Dylon Edwards:这是一个现有的源代码,用于SDN实现的OpenDayLight项目。
2014年

最近出现的一个重现此问题的场景是我从xml文件运行测试套件时。如果xml文件定义了不再存在的类,或者引用了已移动的类的旧标准名称,则JVM无法加载该类。这会导致您观察到奇怪的消息。靠近任何堆栈跟踪可以帮助您识别此类问题,在这种情况下无需传递-e或-X开关。
Ivaylo Slavov

@astack这是什么解决方案?您能标记答案还是自己写一个?
纳曼

Answers:


122

我有同样的问题,并通过添加解决:

<argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>

整个插件元素为:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <forkCount>3</forkCount>
    <reuseForks>true</reuseForks>
    <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
  </configuration>
</plugin>

7
+1我按原样使用了此代码段,它解决了Travis-CI的问题。我们在开发人员的任何工作站上都​​没有得到这个。
StartupGuy

7
上面没有为我解决问题。当其中一个依赖项(jar等).m2损坏时,可能会发生此问题。删除〜/ .m2 /存储库rm -rf ~/.m2/repository,然后mvn install为我解决。
ch4nd4n

2
复制并将其粘贴到我的pom文件中,它就像一种魅力,谢谢
Flaom

7
OpenJDK 64位服务器VM警告:忽略选项MaxPermSize = 256m;在8.0中删除了支持
Julien '18

2
有人可以解释一下它的实际作用和作用吗?
borgmater19年

72

就我而言,该问题与将日志输出到IntelliJ IDEA控制台(OS Windows 10)中的时间过长有关。

命令:

mvn clean install

这个命令为我解决了这个问题:

mvn clean install > log-file.log

日志太长也是我的问题!重定向到日志文件无济于事。更改一些最常见的日志记录语句(从信息到调试)可以解决问题
RvPr

7
在我看来,过多的日志记录是真正的问题!
昌原菜

1
也不要忘记错误流:mvn clean test 2> err.txt 1> out.txt或mvn clean test> out.txt 2>&1或mvn clean test 2>&1 | tee重定向时,您可以在其他控制台中用+ F out.txt观看更少的输出
radzimir

1
对我来说,从Windows cmd切换到Intellij控制台可以解决此问题。
西兰花

3
确实,重定向到日志文件可以解决此问题。
horizo​​n7

40

我有非常类似的问题( Maven build和maven-failsafe-plugin-分叉的VM终止而没有正确说再见),找到了三个对我有用的解决方案:

问题描述

问题是Maven插件maven-surefire-plugin仅在版本2.20.1和2.21.0中才是问题。我检查了一下,然后使用了2.20.1版本。

解决方案1

将插件版本升级到2.22.0。添加pom.xml

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.22.0</version>
</plugin>

解决方案2

将插件版本降级为2.20。添加pom.xml

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.20</version>
</plugin>

解决方案3

使用插件配置testFailureIgnore。添加pom.xml

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <testFailureIgnore>true</testFailureIgnore>
  </configuration>
</plugin>

对我来说,这种组合有效,谢谢:<plugin> <groupId> org.apache.maven.plugins </ groupId> <artifactId> maven-surefire-plugin </ artifactId> <version> 2.22.1 </ version> <configuration> < testFailureIgnore> true </ testFailureIgnore> </ configuration> </ plugin>
Abhishek

感谢这个,使用maven:3.6.0-jdk-10泊坞窗图像和升级到版本3.0.0-M3maven-surefire-plugin解决对我来说也是如此。
danialk

17
关于解决方案3:我们真的可以说忽略测试失败是一种解决方案吗?如果测试的结果毫无意义,那有什么意义呢?
Ulukai

我刚刚将maven-surefire-plugin升级到2.22.2,并且工作正常!
Krzysztof Walczewski,

对!升级到surefire v2.22.2也为我解决了。谢谢!
Migs

32

截至今天(2018年10月30日),我们注意到Jenkins的构建因此错误而中断。

该错误有点令人误解,需要查看转储的输出target/surefire-reports/ 以查看以下错误消息:

Error: Could not find or load main class org.apache.maven.surefire.booter.ForkedBooter

这导致我进入以下SO帖子,其中提到了OpenJDK 181中的可能错误: Maven surefire无法找到ForkedBooter类

该帖子中的任何修复均解决了我的问题。具体来说,我使用以下任一方法:

  1. 从Docker容器中的构建切换 maven:3.5.4-jdk-8maven:3.5.4-jdk-8-alpine
  2. 覆盖Spring Boot的类加载器的详细信息在这里:https : //stackoverflow.com/a/50661649/1228408

1
谢谢。从1.8.0_161-b12切换到11.0.1 + 13对我们的案例有帮助。
Karussell

1
这是我在詹金斯遇到的确切问题,现已解决。谢谢。
Vighnesh Pai

OP出现了另一条错误消息:The forked VM terminated without saying properly goodbye. VM crash or System.exit called ?
PetroCliff

1
@PetroCliff我承认这是我也遇到的错误,当我说“我们注意到我们的构建因此错误而在Jenkins中损坏”时。然后,我继续解释该错误具有误导性,而实际错误在中surefire-reports
majikman19年

25

Surefire常见问题解答的这一部分可以帮助您:

Surefire失败,并显示消息“分叉的VM终止而未正确说再见”

Surefire在任何时候都不支持测试或任何调用System.exit()的引用库。如果这样做,则它们与surefire不兼容,您可能应该向磁带库/供应商提出问题。或者,由于多种原因,分支的VM也可能崩溃,这也可能导致此问题发生。查找表明VM崩溃的经典“ hs_err *”文件,或者在测试执行时检查运行maven的日志输出。崩溃进程的某些“非凡”输出可能会转储到控制台/日志中。如果这是在CI环境中发生的,并且仅在运行一段时间后,您的测试套件很有可能会泄漏某种OS级资源,这会使每次运行情况变得更糟。常规的OS级监控工具可能会给您一些提示。


9

只是面临相同的问题,Ubuntu上的Java 8

然后遇到了https://stackoverflow.com/a/53016532/1676516

似乎使用Java 8 https://issues.apache.org/jira/browse/SUREFIRE-1588的 surefire插件版本2.22.1中的最新错误

按照建议的解决方法通过本地mvn设置 ~/.m2/settings.xml

<profiles>
    <profile>
        <id>SUREFIRE-1588</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
        </properties>
    </profile>
</profiles>

1
只需添加一个较新的版本3.0.0-M1(例如)即可解决此问题。
Galigator

6

今天我遇到了同样的问题,对我来说,真正的问题已在日志中用消息进一步报告 Cannot use a threadCount parameter less than 1; 1 > 0。当添加<threadCount>1</threadCount>surefire-plugin配置时,其他错误消失了。

完整的插件配置:
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <dependencies>
                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>2.18.1</version>
                </dependency>
                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-testng</artifactId>
                    <version>2.18.1</version>
                </dependency>
            </dependencies>
            <configuration>
                <threadCount>1</threadCount>
            </configuration>
        </plugin>

...是的,出于向后兼容的原因,我在此测试框架中同时使用了junit和testng。


6

在JDK 1.8.0_ 65上使用Jacoco插件运行mvn命令时遇到了类似的问题

[INFO]
A fatal error has been detected by the Java Runtime Environment:

JRE version: Java(TM) SE Runtime Environment (8.0_65-b17) (build 1.8.0_65-b17).........
Problematic frame:
PhaseIdealLoop::build_loop_late_post(Node*)+0x144
............
............
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.19:test (default-test) on project 

 The forked VM terminated without properly saying goodbye. VM crash or System.exit called?

JDK中有一个错误https://bugs.openjdk.java.net/browse/JDK-8081379

解决方案是使用参数-XX运行mvn clean install :-UseLoopPredicate

或者只是对JDK进行更新(我认为较新的次要版本有效)


6

关闭maven-surefile-plugin的useSystemClassLoader应该有帮助

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.0</version>
            <configuration>
                <useSystemClassLoader>false</useSystemClassLoader>
            </configuration>
        </plugin>

1
这是为我修复的。我一直在gitlab排队的docker映像上通过工件构建Maven。很难使代表安装生效,并且在尝试了许多surefire设置选项后,此选项在2.22.0版中进行了修复。
理查德·鲍恩

1
必须在Gitlab CI中为每个Maven作业添加此选项,并且不知道为什么。
cljk

5

如果有人包含自定义argLine参数,则必须重新考虑,因为这很可能是内存分配问题的根源。

例如(我以前有):

<argLine>XX:MaxPermSize=4096m ${argLine}</argLine>

现在,我使用硬指定值:

<argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>

无论出于何种原因,与Surefire集成的应用程序(例如Jacoco)都不会请求足够的内存来与构建时进行的测试共存。


5

我也在Jenkins Docker容器中遇到了这个问题(尝试过jenkins:lts,jenkins,jenkins:slim和jenkins:slim-lts。我不想遍历所有存储库并为每个项目更新pom,所以我刚刚将disableClassPathURLCheck添加到maven命令行调用中:

mvn test -DargLine="-Djdk.net.URLClassPath.disableClassPathURLCheck=true"

5

使用maven surefire 2.21.0我解决了将reuseForksoption值从true更改为false的问题

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.21.0</version>
            <configuration>
                <reuseForks>false</reuseForks>
            </configuration>
        </plugin>
    </plugins>
</build>

我正在构建的整个配置部分如下所示:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.21.0</version>
            <configuration>
                <testFailureIgnore>true</testFailureIgnore>
                <skip>false</skip>
                <reuseForks>false</reuseForks>
                <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
                <argLine>-Dfile.encoding=UTF-8</argLine>
                <useSystemClassLoader>false</useSystemClassLoader>
                <includes>
                    <!--Test* classes for the app testing -->
                    <include>**/directory/Test*.java</include>
                </includes>
            </configuration>
        </plugin>
    </plugins>
</build>

4

您需要检查您的计算机是64位还是32位。如果您的计算机是32位的,则您的内存参数不应超过4096,即使它应低于4 GB。但是如果您的计算机是64位的,则安装Java 64位,并在mvn.bat中提供JAVA_HOME,它指向Java 64位安装。


4

我遇到了一种情况,其中没有提供的答案可以解决问题。它使用的是旧版应用程序,恰好正在使用log4j和SLF4J / logback。

以前的情况:clean test从Eclipse中启动时,构建运行良好,但是在命令行中启动时,发生了此错误。基于CircleCI的CI也运行良好。

我所做的事情:纯粹出于猜测,是配置适当的配置logback-test.xml并降低日志记录的详细程度。瞧,我不再遇到此错误,现在可以从命令行构建项目(以及发生此错误的模块)。

我的观点是,使用或配置日志框架的方式可能是另一种解释

log4j和logback之间确实存在冲突吗?还是仅仅是测试产生的大量日志以某种方式使命令行缓冲区溢出?我不知道。对我来说仍然是一个谜。


赞成,因为这可以真正解决/避免/避免问题。我在Windows上使用slf4j和sl4j-simple,输出缓慢也将我也指向了这个方向。设置System.setProperty(SimpleLogger.DEFAULT_LOG_LEVEL_KEY,“警告”); 做到了。将maven-surefire-plugin降级到2.18.1也可以。
marcus

4

升级到Java 12之后,我遇到了类似的问题,对我来说,解决方案是更新jacoco版本 <jacoco.version>0.8.3</jacoco.version>


这确实是我的项目遇到的问题。太糟糕了,这个答案并不明显...
OmriYaHoo

4

2.22.2版在分叉的JVM方面确实存在问题。使用2.20版-就像魅力一样!


<groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>

嗯,这实际上有帮助!
张震

是的,v2.22.2有一个问题maven:3.6-jdk-8-alpine。很烦人!
KimchiMan

3

我最近在用Bamboo构建容器化jar应用程序时遇到了这个错误:

org.apache.maven.surefire.booter.SurefireBooterForkException:分叉的VM终止而没有正确说再见

经过数小时的研究,我将其修复。我认为在这里分享我的解决方案将很有用。

因此,每次mvn clean package在Docker容器中对Java应用程序执行Bamboo运行命令时,都会发生该错误。我不是Maven专家,但问题出在spring-boot中作为Maven依赖项包含的Surefire和Junit4插件。

要修复它,您需要将Junit4替换为Junit5并覆盖您中的Surefire插件 pom.xml

1.在spring boot依赖项中插入排除项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <!-- FIX BAMBOO DEPLOY>
    <exclusions>
        <exclusion>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </exclusion>
    </exclusions>
    <!---->
</dependency>

2.添加新的Junit5依赖项:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.1.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <version>5.1.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-launcher</artifactId>
    <version>1.1.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-runner</artifactId>
    <version>1.1.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.platform</groupId>
    <artifactId>junit-platform-surefire-provider</artifactId>
    <version>1.1.0</version>
    <scope>test</scope>
</dependency>

3.在“插件”部分插入新的插件

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <dependencies>
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-surefire-provider</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.1.0</version>
        </dependency>
    </dependencies>
</plugin>

这足以修复竹制品。别忘了还要转换所有Junit4测试以支持Junit5。


2

在pom.xml中进行设置对我有用。但是您应该查看文档以了解其他解决方法 https://maven.apache.org/surefire/maven-surefire-plugin/examples/class-loading.html

       <plugin>

            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <!--these strange settings fixes a chrash and dumpstream from surefire when run from command line
                    Caused by: java.lang.ClassNotFoundException: org.apache.maven.surefire.booter.ForkedBooter
                -->
                <useSystemClassLoader>true</useSystemClassLoader>
                <useManifestOnlyJar>false</useManifestOnlyJar>
            </configuration>
        </plugin>

2

测试中使用的分叉JVM内存不足。解决方案是禁用分叉JVM并在主JVM上运行测试以确保您有足够的内存,或者通过args增加分叉JVM的内存。

在此答案中查看解决方案




1

您可以设置Java选项

SET JAVA_OPTS='-Xmx1024m' XX:+UseLoopPredicate

mvn clean install


1

在Windows(OpenJDK11,Maven 3.6.0,SUREFIRE 3.0.0-M1)上,我得到了根本原因:

# Created at 2018-11-14T14:28:15.629
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000006c7500000, 522190848, 0) failed; error='The paging file is too small for this operation to complete' (DOS error/errno=1455)

并通过增加分页文件大小,例如像解决


在Linux(4.4.0-145通用,amd64)上,对于Jenkins作业,从Oracle JRE 8更改为AdoptOpenJDK_8u202b08,并开始产生“叉子”错误:-“目标org.apache.maven.plugins的执行默认测试:maven-surefire-plugin:2.19.1:test失败:分叉的VM在没有正确说再见的情况下终止。VM崩溃还是调用了System.exit?-改回Oracle JRE,错误停止。这是唯一一个出现此问题的工作(我们的大约300个工作)。幸运的是,这只是一个内部项目,而不是客户可交付使用的项目,我们可以将其保留在Sun / Oracle JRE上。
罗伯特·

1

尝试以上所有,没有用。下面的解决方案为我工作:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
    <argLine>-Dfile.encoding=UTF-8</argLine>
</configuration>


这个确切的插件版本使我欣喜若狂。顺便说一下,我的配置是: Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T21:41:47+03:00) Java version: 1.8.0_201, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_201\jre Default locale: en_US, platform encoding: Cp1252 OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
tworogue


1

我尝试了所有提供的解决方案(分支,系统加载器,更多内存等),但没有任何效果。

环境:在gitlab ci环境中构建失败,在docker容器中运行了构建。

解决方案:我们在2.20.1版中使用surefireplugin并升级到2.21.0或更高版本(我们使用2.22.1)解决了该问题。

原因SUREFIRE-1422 - surefire使用以下命令ps,该在docker环境中不可用,并导致“崩溃”。此问题已在2.21.0或更高版本中修复。

感谢另一个问题的答案:https : //stackoverflow.com/a/50568662/2970422


1

在端口5005上进行远程调试Selenium测试代码时,我也在MacOS上遇到了此问题。该问题原来是由剩余的surefire-forked-JVM仍在运行引起的。输出到Eclipse IDE终端的日志未显示根本问题,该问题是Address已使用。仅当我在Eclipse实际尝试运行的MacOS终端中运行相同的命令时,才显示日志消息:

/bin/sh -c cd /path/to/your/project/directory && /Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre/bin/java -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 -jar /path/to/target/surefire/surefirebooter230340673926465933.jar /path/to/target/surefire 2019-06-28T10-50-02_140-jvmRun1 surefire6455775580414993159tmp surefire_02461993428448591420tmp

杀死恶意JVM实例(在“活动监视器”中查找Java进程名称)解决了该问题。顺便说一句,我正在运行surefire插件版本2.21.0,而打开jdk 8(v1.8.0_212)没有任何问题。请注意,所有路径都将特定于您的构建环境以及端口(地址= 5005)。


1

使用maven test运行单元测试时,我遇到了同样的问题。尝试更改surefire版本,但它不能正常工作。最终设法解决如下问题:较早:(发生问题时):javac来自jdk 1.8 Java指向jdk 1.11中的java bin电流:(解决问题时):javac和java都指向jdk 1.8中的垃圾箱

关于Teja。


0

在测试类中的静态成员变量称为创建对象的方法(该类在整个类的测试用例中使用过)之后,我遇到了此错误,该方法导致了异常。

// Object created inside test class by calling a static getter.
// Exception thrown in getter:
private static Object someObject = SomeObject.getObject(...);

// ... <Object later used in class>

一些修复包括在每个测试用例中重新创建对象并相应地捕获任何异常。或通过在@BeforeTest方法内部初始化对象并确保其正确构建。


0

就我而言,该问题与工作空间路径有关,该路径时间很长。所以我进行了路径重构,这解决了我的问题。


那是在Windows机器上吗?
hithwen

是的,它正在Windows中运行。
thiago-devel

您是怎么发现的?
dzieciou
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.