java.lang.OutOfMemoryError: Java heap space ใน Maven


123

เมื่อฉันเรียกใช้การทดสอบ maven java.lang.OutOfMemoryError จะเกิดขึ้น ฉัน Google เพื่อหาแนวทางแก้ไขและพยายามexport MAVEN_OPTS=-Xmx1024mแต่ก็ไม่ได้ผล ใครทราบวิธีแก้ปัญหาอื่น ๆ สำหรับปัญหานี้ BTW ฉันใช้ maven 3.0

ขอบคุณล่วงหน้า

วางข้อความแสดงข้อผิดพลาดที่นี่เมื่อเรียกใช้ "mvn test -e"

การทดสอบที่ล้มเหลว:
  คำเตือน (junit.framework.TestSuite $ 1)
  testDefaultPigJob_1 (com.snda.dw.pig.impl.DefaultPigJobLocalTest)
  testDefaultPigJob_2 (com.snda.dw.pig.impl.DefaultPigJobLocalTest)

การทดสอบทำงาน: 11, ความล้มเหลว: 3, ข้อผิดพลาด: 0, ข้าม: 0

10/11/01 13:37:18 การประมวลผลข้อมูลเครื่องยนต์ HExecutionEngine: การเชื่อมต่อกับ hadoop fi
le ระบบที่: file: ///
[ข้อมูล] ----------------------------------------------- -------------------------
[INFO] BUILD FAILURE
[ข้อมูล] ----------------------------------------------- -------------------------
[INFO] เวลาทั้งหมด: 30.063 วินาที
[INFO] สิ้นสุดเมื่อ: Mon Nov 01 13:37:18 PDT 2010
[INFO] หน่วยความจำสุดท้าย: 3M / 6M
[ข้อมูล] ----------------------------------------------- -------------------------
[ข้อผิดพลาด] ล้มเหลวในการดำเนินการเป้าหมาย org.apache.maven.plugins: maven-surefire-plugin: 2
5: test (default-test) ใน project dw.pig: มีการทดสอบล้มเหลว
[ข้อผิดพลาด]
[ข้อผิดพลาด] โปรดดู E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports สำหรับ
r ผลการทดสอบแต่ละรายการ
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: ล้มเหลวในการดำเนินการเป้าหมาย o
rg.apache.maven.plugins: maven-surefire-plugin: 2.5: test (default-test) ในโปรเจ็กต์
 dw.pig: มีการทดสอบล้มเหลว

โปรดดูที่ E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports สำหรับใน
ผลการทดสอบทางแยก
        ที่ org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 199)
        ที่ org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 148)
        ที่ org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 140)
        ที่ org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
กะรัต (LifecycleModuleBuilder.java:84)
        ที่ org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProje
กะรัต (LifecycleModuleBuilder.java:59)
        ที่ org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBu
ILD (LifecycleStarter.java:183)
        ที่ org.apache.maven.lifecycle.internal.LifecycleStarter.execute (Lifecycl
eStarter.java:161)
        ที่ org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:314)
        ที่ org.apache.maven.DefaultMaven.execute (DefaultMaven.java:151)
        ที่ org.apache.maven.cli.MavenCli.execute (MavenCli.java:445)
        ที่ org.apache.maven.cli.MavenCli.doMain (MavenCli.java:168)
        ที่ org.apache.maven.cli.MavenCli.main (MavenCli.java:132)
        ที่ sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
        ที่ sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.
Java: 39)
        ที่ sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAcces
sorImpl.java:25)
        ที่ java.lang.reflect.Method.invoke (Method.java:597)
        ที่ org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Laun
cher.java:290)
        ที่ org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.jav
ที่อยู่: 230)
        ที่ org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (La
uncher.java:409)
        ที่ org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:
352)
เกิดจาก: org.apache.maven.plugin.MojoFailureException: มีการทดสอบล้มเหลว
.

โปรดดูที่ E: \ Code \ Java \ workspace \ dw.pig \ target \ surefire-reports สำหรับใน
ผลการทดสอบทางแยก
        ที่ org.apache.maven.plugin.surefire.SurefirePlugin.execute (SurefirePlugi
n.java:629)
        ที่ org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (ค่าเริ่มต้น
BuildPluginManager.java:107)
        ที่ org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor
.java: 195)
        ... 19 เพิ่มเติม
[ข้อผิดพลาด]
[ข้อผิดพลาด] เรียกใช้ Maven อีกครั้งโดยใช้สวิตช์ -X เพื่อเปิดใช้งานการบันทึกการแก้ไขข้อบกพร่องทั้งหมด
[ข้อผิดพลาด]
[ERROR] สำหรับข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดและวิธีแก้ไขที่เป็นไปได้โปรดเรีย
d บทความต่อไปนี้:
[ERROR] [วิธีใช้ 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc

บางทีคุณอาจมีความจำรั่วในการทดสอบของคุณ? แม้ว่าจะเป็นขยะ แต่คุณยังสามารถสร้างการรั่วไหลของหน่วยความจำใน java ได้: ibm.com/developerworks/library/j-leaks
anio

คำตอบ:


158

เมื่อฉันเรียกใช้การทดสอบ maven java.lang.OutOfMemoryError จะเกิดขึ้น ฉันใช้ Google สำหรับโซลูชันและพยายามส่งออก MAVEN_OPTS = -Xmx1024m แต่ไม่ได้ผล

การตั้งค่าXmxตัวเลือกโดยใช้MAVEN_OPTSไม่ได้ผลจะกำหนดค่า JVM ที่ใช้ในการเริ่มต้น Maven ดังที่กล่าวมา maven-surefire-plugin จะแยก JVM ใหม่ตามค่าเริ่มต้นและของคุณMAVEN_OPTSจะไม่ผ่าน

ในการกำหนดค่าขนาดของ JVM ที่ใช้โดยปลั๊กอิน maven-surefire คุณจะต้อง:

  • เปลี่ยนforkModeไปnever(ซึ่งเป็นความคิดที่ไม่ดีดังนั้นเพราะ Maven จะไม่สามารถแยกได้จากการทดสอบ) ~ หรือ ~
  • ใช้argLineพารามิเตอร์ (วิธีที่ถูกต้อง):

ในกรณีต่อมาสิ่งนี้:

<configuration>
  <argLine>-Xmx1024m</argLine>
</configuration>

แต่ฉันต้องบอกว่าฉันมักจะเห็นด้วยกับ Stephen ที่นี่มีแนวโน้มว่าจะมีบางอย่างผิดปกติกับการทดสอบอย่างใดอย่างหนึ่งของคุณและฉันไม่แน่ใจว่าการเพิ่มความจำให้มากขึ้นเป็นทางออกที่ถูกต้องในการ "แก้" (ซ่อน?) ปัญหาของคุณ

อ้างอิง


1
คุณอัปเดตแท็ก <configuration> ภายใน pom.xml หลักของคุณหรือไม่
Kevin Meredith

3
forkModeเลิกใช้แล้ว: maven.apache.org/surefire/maven-surefire-plugin/…
Macarse

1
@Macarse forkModeเลิกใช้งานแล้ว แต่ฉันคิดว่าจะถูกแทนที่ด้วยforkCountฟังก์ชันที่คล้ายกันเท่านั้น วิธีหนึ่งที่คุณสามารถใช้ MAVEN_OPTS ได้<argLine>${env.MAVEN_OPTS}</argLine>แต่เห็นได้ชัดว่าไม่แนะนำเนื่องจากอาจแตกต่างกันไปในแต่ละคอมพิวเตอร์ ( stackoverflow.com/a/10463133/32453 ) โปรดทราบว่าหากคุณใช้ jacoco คุณควรตั้งค่า argLine ด้วยวิธีอื่นstackoverflow.com/questions/12269558/maven-jacoco-plugin-error
rogerdpack

63

สำหรับผู้ที่เพิ่งเริ่มใช้ Maven (เช่นฉัน) นี่คือ config ทั้งหมดที่อยู่ในส่วน build ของ pom ของคุณ ไชโย

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.19</version>
        <configuration>
            <argLine>-Xmx1024m</argLine>
        </configuration>
      </plugin>
    </plugins>
  </build>

12

โอกาสที่ปัญหาอยู่ในการทดสอบหน่วยหนึ่งที่คุณขอให้ Maven เรียกใช้

ดังนั้นการเล่นซอกับขนาดฮีปจึงเป็นแนวทางที่ไม่ถูกต้อง แต่คุณควรดูการทดสอบหน่วยที่ทำให้เกิด OOME และพยายามหาว่าเป็นความผิดพลาดของการทดสอบหน่วยหรือรหัสที่กำลังทดสอบ

เริ่มต้นด้วยการดูที่การติดตามสแต็ก หากไม่มีให้เรียกใช้mvn ... testอีกครั้งด้วย-eตัวเลือก


@ Stephen ฉันสามารถผ่านกรณีทดสอบใน eclipse หลังจากที่ฉัน set-Xmx1024m ในการกำหนดค่าการรัน แต่มันมักจะโยน OutOfMemoryError เมื่อฉันเรียกใช้ "mvn test" ในคอนโซลแม้ว่าฉันจะเพิ่ม -e options "mvn test -DMAVEN_OPTS = -Xmx1024m "
zjffdu

2
@zjffdu - คุณพลาดประเด็นของฉันไปแล้ว! จุดประสงค์ของการเพิ่ม "-e" ไม่ใช่เพื่อให้การทดสอบทำงาน มันคือการค้นหาว่าทำไมพวกเขาถึงไม่ทำงาน
Stephen C

1
@zjffdu - ในกรณีนี้คุณจะต้องดีบักสิ่งนี้อย่างยากลำบากเช่นเดียวกับปัญหา Java อื่น ๆ
Stephen C

2
ฉันได้รับปัญหานี้ขณะเรียกใช้กรณีทดสอบ GWT ซึ่งจำลองสภาพแวดล้อมเบราว์เซอร์เต็มรูปแบบ บางครั้งก็สามารถเพิ่มขนาดฮีปได้
djjeck

1
@djjeck - ใช่บางครั้ง แต่ฉันไม่คิดว่ามันเป็นทางออกที่ถูกต้องเกือบตลอดเวลา
Stephen C

8

ในการแก้ไขปัญหานี้ชั่วคราวฉันพบว่าวิธีต่อไปนี้เป็นวิธีที่เร็วที่สุด:

export JAVA_TOOL_OPTIONS="-Xmx1024m -Xms1024m"

6

ฉันได้แก้ปัญหานี้กับฉัน 2 วิธี:

  1. การเพิ่มการกำหนดค่านี้ใน pom.xml

    <configuration><argLine>-Xmx1024m</argLine></configuration>
  2. เปลี่ยนไปใช้ JDK 1.7 แทน 1.6


2

ในการแก้ไข java.lang.OutOfMemoryError: Java heap space ใน Maven ให้ลองกำหนดค่าคอนฟิกด้านล่างใน pom

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>${maven-surefire-plugin.version}</version>
     <configuration>
        <verbose>true</verbose>
        <fork>true</fork>
        <argLine>-XX:MaxPermSize=500M</argLine>
    </configuration>
</plugin>

1
+1 สำหรับการกล่าวถึง MaxPermSize หากข้อผิดพลาดหน่วยความจำไม่เพียงพอของคุณเกิดจากการโหลดคลาสพันล้านเช่นการสร้าง HiveContext ใหม่ในการทดสอบหน่วยของคุณนี่คือทางออกของคุณ
swdev

-2

ไม่เพียง แต่หน่วยความจำเท่านั้น เพิ่มขนาดการอนุญาตเพื่อแก้ไขข้อยกเว้นนั้นใน maven ใช้ตัวแปรเหล่านี้ในตัวแปรสภาพแวดล้อม

variable name: MAVEN_OPTS
variable value: -Xmx512m -XX:MaxPermSize=256m

ตัวอย่าง:

export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=500m"

ข้อผิดพลาดจะไม่เป็น "Java heap space" แต่ต่างกัน
Karl Richter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.