Maven Out of Memory Build ล้มเหลว


90

ณ วันนี้การรวบรวม maven ของฉันล้มเหลว

[INFO] [ERROR] Unexpected
[INFO] java.lang.OutOfMemoryError: Java heap space
[INFO]  at java.util.Arrays.copyOfRange(Arrays.java:2694)
[INFO]  at java.lang.String.<init>(String.java:203)
[INFO]  at java.lang.String.substring(String.java:1877)

[ข้อผิดพลาด] หน่วยความจำไม่เพียงพอ เพื่อเพิ่มจำนวนหน่วยความจำให้ใช้แฟล็ก -Xmx เมื่อเริ่มต้น (java -Xmx128M ... )

เมื่อวานนี้ฉันรัน maven compile สำเร็จแล้ว

ณ วันนี้ผมเพิ่งชนกองของฉันไป3 GB นอกจากนี้ฉันเปลี่ยนโค้ดเล็กน้อยเพียง 2-3 บรรทัดดังนั้นฉันจึงไม่เข้าใจข้อผิดพลาด 'หน่วยความจำไม่เพียงพอ' นี้

vagrant@dev:/vagrant/workspace$ echo $MAVEN_OPTS
-Xms1024m -Xmx3000m -Dmaven.surefire.debug=-Xmx3000m

แก้ไข: ฉันลองใช้ความคิดเห็นของผู้โพสต์โดยเปลี่ยน pom.xml ของโมดูลที่ล้มเหลว แต่ฉันมีข้อผิดพลาดในการสร้าง maven เหมือนกัน

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.5</source>
            <target>1.5</target>
            <fork>true</fork>
            <meminitial>1024m</meminitial>
            <maxmem>2024m</maxmem>
       </configuration>
    </plugin>

1
คุณสามารถจัดหา stacktrace เพิ่มเติมได้หรือไม่? ฉันอยากรู้อยากเห็นว่าอะไรทำให้การเริ่มต้น String หมดหน่วยความจำ การตั้งค่าขนาดกองเสียง MAVEN_OPTS เช่นวิธีที่จะไป แต่ฉันเดาบางที่มีขนาดใหญ่ String -Xmxขันที่คุณอาจไม่ได้รับการจัดสรรเพียงพอสำหรับ
Edward Samson

คำตอบ:


139

คุณกำลังพูดถึงโมดูล "เว็บ" ประเภทใด เป็นสงครามที่เรียบง่ายและมีสงครามประเภทบรรจุภัณฑ์หรือไม่?

หากคุณไม่ได้ใช้ชุดเครื่องมือเว็บ (GWT) ของ Google คุณก็ไม่จำเป็นต้องให้ข้อมูลใด ๆ gwt.extraJvmArgs

การบังคับขั้นตอนการคอมไพล์อาจไม่ใช่ความคิดที่ดีที่สุดเนื่องจากเป็นการเริ่มกระบวนการที่สองซึ่งไม่สนใจMAVEN_OPTSทั้งหมดจึงทำให้การวิเคราะห์ยากขึ้น

ดังนั้นฉันจะพยายามเพิ่ม Xmx โดยการตั้งค่า MAVEN_OPTS

export MAVEN_OPTS="-Xmx3000m"

และอย่าแยกคอมไพเลอร์ไปยังกระบวนการอื่น

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>1.5</source>
        <target>1.5</target>
   </configuration>
</plugin>

-XX:MaxPermSize=512mไม่ควรจำเป็นต้องเพิ่มขึ้นเพราะถ้าขนาดดัดเป็นสาเหตุของปัญหาฉันจะคาดหวังข้อผิดพลาดjava.lang.OutOfMemoryError: PermGen space

-XX:+HeapDumpOnOutOfMemoryErrorหากไม่ได้แก้ปัญหาของคุณแล้วคุณสามารถสร้างกองทิ้งสำหรับการวิเคราะห์ต่อไปโดยการเพิ่ม นอกจากนี้คุณสามารถใช้ jconsole.exe ในไดเร็กทอรี java bin ของคุณเพื่อเชื่อมต่อกับ jvm ในขณะที่การคอมไพล์กำลังทำงานอยู่และดูว่าเกิดอะไรขึ้นภายในฮีปของ jvm

อีกแนวคิดหนึ่ง (อาจจะโง่) ที่คิดขึ้นมาคุณมี RAM เพียงพอในเครื่องของคุณหรือไม่? การกำหนดขนาดหน่วยความจำเป็นสิ่งที่ดี แต่ถ้าโฮสต์ของคุณมีเพียง 4GB และคุณอาจมีปัญหาว่า Java ไม่สามารถใช้หน่วยความจำที่กำหนดได้เนื่องจาก OS, Java, MS-Office ใช้อยู่แล้ว ...


ขอบคุณสำหรับการตอบกลับของคุณ. คำแนะนำของคุณในการลบ JVM ที่แยกออกมาใช้กับ 'maven-surefire-plugin' ด้วยหรือไม่ ฉันลองใช้คำแนะนำของคุณเพื่อเพิ่มหน่วยความจำ MAVEN_OPTS ของฉันเป็น 3000 maven-compiler ของฉันไม่มีการตั้งค่าสำหรับ JVM ที่แยกออกมาดังนั้นฉันจึงไม่จำเป็นต้องเปลี่ยนแปลงอะไรที่นั่น ใช่ Guest VM ของฉันมี RAM 4 GB เครื่องโฮสต์มี RAM 8 GB
Kevin Meredith

2
อย่างไรก็ตามการสร้าง mvn ล้มเหลวอีกครั้งด้วยคำแนะนำของคุณ
Kevin Meredith

1
โดยปกติฉันจะพยายามหลีกเลี่ยงการตีกระบวนการตราบเท่าที่ฉันไม่ได้ทำงาน หากระบบของคุณมีเพียง 4GB ระบบปฏิบัติการจะใช้ ~ 1 GB คุณจึงเหลือ 3GB หาก maven ขึ้นต้นด้วย Xms = 1GB หน่วยความจำที่เหลือคือ 2GB ถัดไปส้อมคอมไพเลอร์เริ่มต้นด้วย Xms = 1GB .... ซึ่งจะลดหน่วยความจำฟรีเหลือ 1GB ตอนนี้คุณสามารถแทนที่ PermGen Memory 128MB ซึ่งเป็นกระบวนการปลั๊กอินที่ไม่ปลอดภัยที่แยกออกจากกัน ... ดังที่คุณเห็นการตั้งค่า Xmx ของคุณส่วนใหญ่อาจไม่สามารถใช้เป็น JVM ได้เนื่องจากหน่วยความจำนั้นเรียบง่ายไม่ฟรี คุณลองใช้ JConsole แล้วหรือยัง? และ HeapDumpOnOutOfMemoryError?
vach

ฉันลบ Xms1024m ออกจาก MAVEN_OPTS ของฉัน แต่การสร้าง mvn ยังคงล้มเหลว ฉันได้เพิ่ม "HeapDump ... " ใน MAVEN_OPTS ของฉัน แต่ฉันไม่แน่ใจว่าจะพิมพ์ดัมพ์ที่ไหน กำลังมองหา JConsole ตอนนี้
Kevin Meredith

Dumps เป็น plces ในไดเรกทอรี
jvms

37

การตอบช้าเพื่อพูดถึงตัวเลือกอื่นแทนที่จะเป็นMAVEN_OPTSตัวแปรสภาพแวดล้อมทั่วไปเพื่อส่งผ่านไปยัง Maven สร้างตัวเลือก JVM ที่ต้องการ

ตั้งแต่ Maven 3.3.1คุณสามารถมี.mvnโฟลเดอร์เป็นส่วนหนึ่งของโครงการที่เกี่ยวข้องและjvm.configไฟล์เป็นสถานที่ที่สมบูรณ์แบบสำหรับตัวเลือกดังกล่าว

ไฟล์คอนฟิกูเรชันที่เป็นทางเลือกใหม่สองไฟล์.mvn/jvm.configและ.mvn/maven.configอยู่ที่ไดเร็กทอรีฐานของแผนผังแหล่งโครงการ หากมีไฟล์เหล่านี้จะมีตัวเลือก jvm และ maven เริ่มต้น เนื่องจากไฟล์เหล่านี้เป็นส่วนหนึ่งของแผนผังแหล่งที่มาของโปรเจ็กต์ไฟล์เหล่านี้จะปรากฏในการชำระเงินของโปรเจ็กต์ทั้งหมดและจะถูกใช้โดยอัตโนมัติทุกครั้งที่สร้างโปรเจ็กต์

เป็นส่วนหนึ่งของบันทึกประจำรุ่นอย่างเป็นทางการ

ใน Maven ไม่ใช่เรื่องง่ายที่จะกำหนดคอนฟิกูเรชัน JVM บนฐานต่อโปรเจ็กต์ กลไกที่มีอยู่ตามตัวแปรสภาพแวดล้อมMAVEN_OPTSและการใช้งาน${user.home}/.mavenrcเป็นตัวเลือกอื่นที่มีข้อเสียเปรียบในการไม่เป็นส่วนหนึ่งของโครงการ

เริ่มต้นด้วยรีลีสนี้คุณสามารถกำหนดคอนฟิกูเรชัน JVM ผ่าน${maven.projectBasedir}/.mvn/jvm.configไฟล์ซึ่งหมายความว่าคุณสามารถกำหนดอ็อพชันสำหรับบิลด์ของคุณบนฐานต่อโปรเจ็กต์ ไฟล์นี้จะกลายเป็นส่วนหนึ่งของโปรเจ็กต์ของคุณและจะถูกเช็คอินพร้อมกับโปรเจ็กต์ของคุณ จึงไม่จำเป็นอีกต่อไปMAVEN_OPTS, .mavenrcไฟล์ ตัวอย่างเช่นหากคุณใส่อ็อพชัน JVM ต่อไปนี้ลงใน${maven.projectBasedir}/.mvn/jvm.configไฟล์:

-Xmx2048m -Xms1024m -XX:MaxPermSize=512m -Djava.awt.headless=true

ข้อได้เปรียบหลักของแนวทางนี้คือการกำหนดค่าจะแยกออกจากโครงการที่เกี่ยวข้องและนำไปใช้กับโครงสร้างทั้งหมดด้วยและเปราะบางน้อยกว่าMAVEN_OPTSสำหรับนักพัฒนารายอื่นที่ทำงานในโครงการเดียวกัน (โดยลืมตั้งค่า)
นอกจากนี้ตัวเลือกจะถูกนำไปใช้กับโมดูลทั้งหมดในกรณีของโครงการหลายโมดูล


2
โปรดทราบว่า MaxPermSize จะถูกละเว้นหากคุณใช้ JDK 8
GeraldScott

15

ฉันประสบปัญหาเดียวกันกับการพยายามรวบรวม "การติดตั้งใหม่ทั้งหมด" โดยใช้ VPS ของ RAM Lowend 512Mb และ CPU ที่ดี เรียกใช้ OutOfMemory และสคริปต์ที่ถูกฆ่าซ้ำ ๆ

ฉันใช้export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"และทำงาน

ยังคงได้รับความล้มเหลวในการรวบรวมอื่น ๆ เนื่องจากเป็นครั้งแรกที่ฉันต้องการ Maven แต่ปัญหา OutOfMemory หายไปแล้ว


11

เพิ่มตัวเลือก

-XX:MaxPermSize=512m

ถึง MAVEN_OPTS

maven-compiler-plugin ตัวเลือก

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.5.1</version>
    <configuration>
      <fork>true</fork>
      <meminitial>1024m</meminitial>
      <maxmem>2024m</maxmem>
    </configuration>
  </plugin>

2
ฉันได้เพิ่มตัวเลือก -XX: MaxPermSize = 1024m หลังจากสร้างโพสต์นี้ แต่ฉันยังมีข้อผิดพลาดเกี่ยวกับหน่วยความจำไม่เพียงพอ อีกโพสต์ SO กล่าวว่าฉันต้องเพิ่มตัวเลือกให้กับ argLine ของ maven-surefire-plugin เพื่อเพิ่มหน่วยความจำที่ใช้โดยเธรดที่แยกออกมา ฉันเพิ่มเป็น <argLine> -Xms256m -Xmx1024m -XX: PermSize = 128m -XX: MaxPermSize = 512m </argLine>
Kevin Meredith

ฉันควรจะพูดว่า ... ไม่การสร้าง maven ยังคงล้มเหลว
Kevin Meredith

เพิ่มคุณสมบัติทั้งหมดนี้ไปmaven-compilier-pluginและการเพิ่มขึ้น-XX:MaxPermSize, Xmxควรจะ =XX:MaxPermSize
Ilya

ใช้ตัวเลือก <fork> true </true> ในmaven-compilier-plugin
Ilya

ฉันลองแล้ว (โปรดดูโพสต์ต้นฉบับ) แต่การสร้าง mvn ของฉันยังล้มเหลว
Kevin Meredith

4

ฉันมีปัญหาเดียวกันเมื่อรวบรวม Druid.io การเพิ่ม MaxDirectMemorySize ในที่สุดก็ใช้งานได้

export MAVEN_OPTS="-Xms8g -Xmx8g -XX:MaxDirectMemorySize=4096m"

อยากรู้อยากเห็น MaxDirectMemorySize จะไม่ถูกผูกมัดโดยค่าเริ่มต้นอย่างเห็นได้ชัด (เช่นคุณเพิ่มขีด จำกัด ไม่ได้ปรับค่าที่มีมาก่อน)
Tomer Gabel

4

การกำหนดค่าด้านล่างนี้ใช้งานได้ในกรณีของฉัน

<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>

พยายามใช้ -XX: MaxPermSize แทน -XX: MaxPermGen



3

คุณใช้ระบบปฏิบัติการประเภทใด

ในการกำหนดหน่วยความจำมากกว่า 2GB จำเป็นต้องเป็นระบบปฏิบัติการ 64 บิตเป็นอย่างน้อย

แล้วมีปัญหาอีก แม้ว่าระบบปฏิบัติการของคุณจะมี RAM ไม่ จำกัด แต่ก็มีการแยกส่วนในลักษณะที่ไม่มีบล็อกฟรี 2GB ให้ใช้งานคุณจะไม่ได้รับข้อยกเว้นหน่วยความจำด้วย และโปรดทราบว่าหน่วยความจำ Heap ปกติเป็นเพียงส่วนหนึ่งของหน่วยความจำที่กระบวนการ VM ใช้ ดังนั้นในเครื่อง 32 บิตคุณอาจไม่สามารถตั้งค่า Xmx เป็น 2048MB ได้

ฉันขอแนะนำให้ตั้งค่า min สูงสุดหน่วยความจำเป็นค่าเดียวกันเพราะในกรณีนี้ทันทีที่ VM หมดหน่วยความจำเวลาเริ่ม 1GB จะถูกจัดสรรตั้งแต่เริ่มต้น VM จะจัดสรรบล็อกใหม่ (สมมติว่าเพิ่มขึ้นด้วย 500MB บล็อก) จาก 1,5GB หลังจากนั้นได้รับการจัดสรรมันจะคัดลอกทุกสิ่งจากบล็อกหนึ่งไปยังบล็อกใหม่และหน่วยความจำฟรีหลังจากนั้น หากหน่วยความจำหมดอีกครั้งจะมีการจัดสรร 2GB และคัดลอก 1,5 GB จะจัดสรรหน่วยความจำ 3,5GB ชั่วคราว


2

ในขณะที่สร้างโครงการบนแพลตฟอร์ม Unix / Linux ให้ตั้งค่าไวยากรณ์ตัวเลือก Maven ดังต่อไปนี้ สังเกตว่าเครื่องหมาย qoutation เดี่ยวไม่ใช่ double qoutation

export MAVEN_OPTS='-Xmx512m -XX:MaxPermSize=128m'

0

การใช้. mvn / jvm.config ใช้ได้ผลกับฉันบวกกับประโยชน์เพิ่มเติมของการเชื่อมโยงกับโครงการ


0

สิ่งนี้เกิดขึ้นในโครงการขนาดใหญ่บน Windows เมื่อใช้ cygwin หรือโปรแกรมจำลอง linux อื่น ๆ (git bash) โดยบังเอิญทั้งคู่ไม่ได้ทำงานในโครงการของฉันโครงการโอเพ่นซอร์สขนาดใหญ่คืออะไร ในสคริปต์ sh จะมีการเรียกคำสั่ง mvn สองคำสั่ง ขนาดหน่วยความจำจะขยายเป็นขนาดฮีปที่ใหญ่กว่าที่ระบุไว้ใน Xmx และส่วนใหญ่ในกรณีที่สองกระบวนการ windows จะเริ่มทำงาน ซึ่งทำให้การใช้หน่วยความจำสูงขึ้น

วิธีแก้ปัญหาในกรณีนี้คือการใช้ไฟล์แบตช์และลดขนาด Xmx จากนั้นการดำเนินการ maven จะสำเร็จ หากมีความสนใจสามารถเปิดเผยรายละเอียดเพิ่มเติมได้


0

มีคนพูดถึงปัญหาเกี่ยวกับระบบปฏิบัติการ 32 บิตแล้ว ในกรณีของฉันปัญหาคือฉันกำลังคอมไพล์ด้วย JDK 32 บิต


0

การเพิ่มขนาดหน่วยความจำในตัวแปรสภาพแวดล้อม "MAVEN_OPTS" จะช่วยแก้ไขปัญหานี้ได้ สำหรับฉันการเพิ่มจาก -Xmx756M เป็น -Xmx1024M ทำได้

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