jenkins运行报错:Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project lego

 起因:我要对4000条数据循环请求搜索接口,校验返回值,然后在Jenkins上面运行的时候报错:maven-surefire-plugin执行test失败,但是运行70条数据的时候就不会报错,而且程序本身也没有错误,猜测应该是数据量大导致的。通过查阅网上的资料说是要设置surefire插件的jvm 参数。

 Jenkins运行报下面的错误:

Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test (default-test) on project lego: Execution default-test of goal org.apache.maven.plugins:maven-surefire-plugin:2.18.1:test failed: The forked VM terminated without properly saying goodbye. VM crash or System.exit called?

 

1

 

解决方法:

在pom文件中的maven-surefire-plugin插件标签里面增加下面一行:

1

<argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine><br>完整如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<plugin>

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-surefire-plugin</artifactId>

                <version>2.18.1</version>

                <configuration>

                    <forkMode>once</forkMode>

                    <argLine>-Dfile.encoding=UTF-8 -Xmx1024m -XX:MaxPermSize=256m</argLine>

                    <suiteXmlFiles>

                        <suiteXmlFile>${resource.dir}${case}/testng.xml</suiteXmlFile>

                    </suiteXmlFiles>

                    <testFailureIgnore>true</testFailureIgnore>

                    <properties>

                        <property>

                            <name>usedefaultlisteners</name>

                            <value>true</value>

                        </property>

                    </properties>

                    <reportsDirectory>target/surefire-reports</reportsDirectory>

                </configuration>

            </plugin>

  

Maven运行测试用例时,是通过调用maven的surefire插件并fork一个子进程来执行用例的,

使用argLine属性,可以指定额外的参数传递给forked的jvm进程,例如内存设置

JVM 参数:

-Xmx1024m  jvm最大允许分配的堆内存,按需分配

-XX:MaxPermSize=256m  jvm最大允许分配的非堆内存,按需分配

 

java的内存管理机制:

堆(heap)和非堆(non-heap):

堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在java虚拟机启动时创建的。在jvm堆之外的内存称为非堆内存

堆是java代码可用的内存,是留给开发人员使用的,非堆是jvm留给自己用的,


堆内存分配


 JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;
 空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。
 说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,无法用try...catch捕捉。 

 

非堆内存分配


 JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

好文要顶 关注我 收藏该文  

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐