การตั้งค่า Java heap space ภายใต้ Maven 2 บน Windows


91

ฉันได้รับข้อความนี้ระหว่างการสร้างโครงการของฉัน

java.lang.OutOfMemoryError: พื้นที่ฮีป Java

ฉันจะเพิ่มพื้นที่ฮีปได้อย่างไรฉันมี 8Gb หรือ RAM มันเป็นไปไม่ได้เลยที่ maven กินมากขนาดนั้นฉันพบhttp://vikashazrati.wordpress.com/2007/07/26/quicktip-how-to-increase-the -java-heap-memory-for-maven-2-on-linux /วิธีทำบน linux แต่ฉันใช้ windows 7 จะเปลี่ยน java heap space ใต้ windows ได้อย่างไร?


ฉันถือว่าคุณใช้ Windows รุ่น 64 บิต? ถ้าไม่คุณจะไม่ระบุมากกว่า 1.5G เป็นขนาดฮีปหน้าต่าง 0.5G อื่น ๆ ช่วยให้คุณใช้งานได้โดยตรง JVM จะต้องใช้ มีตัวเลือกในการรับ windows เพื่อใช้เฉพาะ 1G สำหรับรหัสโหมด kernal และ 3G สำหรับรหัสโหมดผู้ใช้ แต่ sun JVM ไม่อนุญาตให้คุณใช้
vickirk

@vickirk ฉันใช้ Windows รุ่น 64 บิต
Gandalf StormCrow

1
คุณใช้ JVM เวอร์ชัน 64 บิตด้วยหรือไม่ จะแสดงเป็น Windows x64 ในรายการแบบเลื่อนลงในหน้าดาวน์โหลด JDK: java.sun.com/javase/downloads/widget/jdk6.jsp
Powerlord

คำตอบ:


117

ตัวแปรสภาพแวดล้อมจะเป็นชุดยกตัวอย่างเช่นMAVEN_OPTS MAVEN_OPTS=-Xmx1024mการmaxmemกำหนดค่าใน pom จะใช้เฉพาะเมื่อคุณตั้งค่าปลั๊กอินคอมไพเลอร์เพื่อแยก javacเป็น JVM ใหม่ มิฉะนั้นปลั๊กอินจะทำงานภายใน VM เดียวกันกับ Maven ดังนั้นภายในหน่วยความจำจะส่งผ่านบรรทัดคำสั่งผ่านไฟล์MAVEN_OPTS.

ในการตั้งค่า MAVEN_OPTS ใน Windows 7:

  1. คลิกขวาที่ My Computer และเลือกProperties (แป้นพิมพ์ลัดกดWindows+ Pause/Break)
  2. คลิกลิงก์Advanced System Settings ที่อยู่ในการนำทางด้านซ้ายของ System Properties เพื่อแสดงAdvanced System Properties
  3. ไปที่ขั้นสูงแท็บคลิกตัวแปรสภาพแวดล้อมปุ่มตั้งอยู่ที่ด้านล่างของขั้นสูงคุณสมบัติของระบบหน้าต่างการตั้งค่า
  4. สร้างตัวแปรผู้ใช้ใหม่ตั้งชื่อตัวแปรเป็น MAVEN_OPTS และตั้งค่าตัวแปรเป็น-Xmx1024m(หรือมากกว่า)

mvnเปิดหน้าต่างคำสั่งใหม่และเรียกใช้


1
สิ่งนี้มีผลกระทบต่อความเร็วในการสร้างของฉันหรือไม่? มีเคล็ดลับในการเพิ่มพลังสร้าง maven ของฉันด้วยการจัดสรรหน่วยความจำเพิ่มเติมหรือไม่?
Mahendran

45

หากคุณใช้พื้นที่ฮีปจนหมดในระหว่างการทดสอบ JUnit surefire (หรือไม่ปลอดภัย) การเปลี่ยน MAVEN_OPTS อาจไม่ช่วยคุณ ฉันพยายามกำหนดค่าต่างๆใน MAVEN_OPTS ต่อไปโดยไม่มีโชคจนกระทั่งพบโพสต์นี้ที่แก้ไขปัญหาได้

โดยทั่วไปแล้ว JUnits จะแยกออกเป็นสภาพแวดล้อมของตนเองและละเว้นการตั้งค่าใน MAVEN_OPTS คุณต้องกำหนดค่า surefire ใน pom ของคุณเพื่อเพิ่มหน่วยความจำเพิ่มเติมสำหรับ JUnits

หวังว่าจะสามารถช่วยคนอื่นได้บ้าง!


แก้ไข: การคัดลอกโซลูชันจากบล็อกของ Keith Chapmanในกรณีที่ลิงก์หยุดทำงานในบางวัน:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <forkMode>pertest</forkMode> 
    <argLine>-Xms256m -Xmx512m</argLine>
    <testFailureIgnore>false</testFailureIgnore> 
    <skip>false</skip> 
    <includes> 
      <include>**/*IntegrationTestSuite.java</include>
    </includes>
  </configuration>
</plugin>

อัปเดต (5/31/2017): ขอบคุณ@johnstosh ที่ชี้ให้เห็นสิ่งนี้ - surefire มีการพัฒนาขึ้นเล็กน้อยตั้งแต่ฉันใส่คำตอบนี้ไว้ที่นั่น นี่คือลิงก์ไปยังเอกสารประกอบและตัวอย่างโค้ดที่อัปเดต (บรรทัดอาร์กิวเมนต์ยังคงเป็นส่วนสำคัญสำหรับคำถามนี้):

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.20</version>
    <configuration>
        <forkCount>3</forkCount>
        <reuseForks>true</reuseForks>
        <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
        <systemPropertyVariables>
            <databaseSchema>MY_TEST_SCHEMA_${surefire.forkNumber}</databaseSchema>
        </systemPropertyVariables>
        <workingDirectory>FORK_DIRECTORY_${surefire.forkNumber}</workingDirectory>
    </configuration>
  </plugin>

มันช่วยประหยัดเวลาของฉันได้บ้าง! ขอบคุณ! น่าเสียดายที่ฉันโหวตได้เพียงครั้งเดียวเท่านั้น! :)
javanna

นี่คือคำตอบที่เป็นประโยชน์ที่สุดระหว่างคนอื่น ๆ ในสไตล์ maven ที่แท้จริง ขอบคุณ!
Andremoniy

นี่คือคำตอบที่แท้จริงของคำถาม
Jonathan Landrum

1
ดูเอกสารใน Surefire surefire เวอร์ชันก่อนหน้า 2.14 ใช้พารามิเตอร์ forkMode เพื่อกำหนดค่า forking แม้ว่าพารามิเตอร์นั้นจะยังคงได้รับการสนับสนุนสำหรับความเข้ากันได้แบบย้อนหลัง แต่ขอแนะนำให้ผู้ใช้โอนย้ายการกำหนดค่าและใช้ forkCount และ reuseForks แทน
johnstosh

21

ควรเป็นคำสั่งเดียวกันยกเว้น SET แทนที่จะเป็น EXPORT

  • ตั้งค่า MAVEN_OPTS = -Xmx512m จะให้ฮีป 512Mb
  • ตั้งค่า MAVEN_OPTS = -Xmx2048m จะให้ 2b ของฮีป

ฉันยอมรับว่ามันควรจะเป็นคำสั่งเดียวกัน แต่นั่นไม่ได้ทำให้มันเป็นคำสั่งที่แท้จริงนี่คือเหตุผลC:\my_project>MAVEN_OPTS=-Xmx512m 'MAVEN_OPTS' is not recognized as an internal or external command, operable program or batch file.
Gandalf StormCrow

glowcoder ผิดเล็กน้อย คุณไม่จำเป็นต้องส่งออกตัวแปร แต่ในการกำหนดค่าให้กับตัวแปรนั้นคุณต้องตั้งค่า
JeremyP

คุณยังสามารถตั้งค่า MAVEN_OPTS เป็นตัวแปรสภาพแวดล้อม windows ได้หากคุณต้องการใช้ค่าเดียวกันสำหรับทุกบิลด์
digitaljoel

@Gandalf คุณต้องวางชุดไว้ข้างหน้า @Jeremy ใช่แล้วนั่นคือเหตุผลที่บอกว่าให้ใช้ set แทนการส่งออก
corsiKa

9

บน Mac: แทนที่จะใช้JAVA_OPTSและMAVEN_OPTSให้ใช้ _JAVA_OPTIONS แทน ได้ผล!


สิ่งนี้ใช้ได้กับ windows เพิ่มสิ่งนี้เป็นตัวแปรสภาพแวดล้อมใน maven run configuration ใน eclipse การทดสอบที่รันจาก m2e ไม่ให้ PermGen error อีกต่อไป
fedeb

3

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

หากต้องการเปลี่ยนสิ่งเหล่านั้นใน Eclipse ให้ไปที่ Window -> Preferences -> Java -> Installed JREs เลือก JRE / JDK ที่เลือกไว้แล้วคลิกแก้ไข


0

บน windows:

เพิ่มตัวแปรสภาพแวดล้อม (ทั้งในระบบและตัวแปรของผู้ใช้ฉันมีปัญหาแปลก ๆ ที่ได้รับตัวแปรจากที่ต่างๆดังนั้นฉันจึงเพิ่มตัวแปรทั้งสองอย่าง)

ตั้งชื่อว่า MAVEN_OPTS

มูลค่าจะเป็น: -Xms1024m -Xmx3000m -XX:MaxPermSize=1024m -XX:+CMSClassUnloadingEnabled

ตัวเลขอาจแตกต่างกันทำให้สัมพันธ์กับขนาด mem ของคุณ

ฉันมีปัญหานั้นและสิ่งนี้ได้รับการแก้ไขแล้วไม่มีอะไรอื่น!


0

มันใช้งานได้ - ในการเปลี่ยน Eclipse ให้ไปที่ Window -> Preferences -> Java -> Installed JREs เลือก JRE / JDK ที่เลือกไว้แล้วคลิกแก้ไข

อาร์กิวเมนต์ VM เริ่มต้น = -Xms128m -Xmx1024m


-7

คุณกำลังมองหา 2 ตัวเลือกเพื่อjava:

  • ขนาดฮีปสูงสุด -Xmx
  • -Xms ขนาดฮีปเริ่มต้น

ใส่ไว้ในการเรียกใช้บรรทัดคำสั่งของjavaไฟล์ปฏิบัติการเช่นนี้:

java -Xms512M -Xmx1024M my.package.MainClass

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

สำหรับโครงการทุกวันให้ทำในสิ่งที่คุณคิดว่าดีพอ โปรไฟล์เพื่อขอความช่วยเหลือ


1
ในฐานะที่เป็นสถานะ ebelisle ตัวเลือกนี้จะใช้ไม่ได้เลยเมื่อคุณใช้ Maven ต้องระบุอย่างน้อยนั่นคือตัวเลือก Maven ที่มี "-D" แต่ก็ยังไม่ใช่คำสั่ง java ที่เรากำลังพูดถึง
frandevel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.