मैवेन आउट ऑफ़ मेमोरी बिल्ड फ़ेल्योर


88

आज तक, मेरे मावेन संकलन विफल हो गए।

[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 ...)

कल तक मैंने सफलतापूर्वक एक मावेन संकलन चलाया था।

आज के अनुसार, मैंने अपने ढेर को 3 जीबी तक बढ़ा दिया । इसके अलावा, मैंने केवल कोड की 2-3 छोटी लाइनों को बदल दिया है, इसलिए मुझे यह 'आउट ऑफ मेमोरी' त्रुटि नहीं समझ में आती है।

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

संपादित करें: मैंने अपने असफल मॉड्यूल के pom.xml को बदलकर पोस्टर की टिप्पणी की कोशिश की। लेकिन मुझे वही मावेन बिल्ड एरर मिला।

    <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
क्या आप स्टैकट्रेस के अधिक प्रदान कर सकते हैं? मैं यह देखने के लिए उत्सुक हूं कि स्मृति से बाहर चलाने के लिए एक स्ट्रिंग इनिशियलाइज़ेशन क्या हो सकता है। MAVEN_OPTS में ढेर का आकार निर्धारित करने के लिए जाने के रास्ते की तरह लगता है, लेकिन मेरा अनुमान है कि कहीं न कहीं एक हास्यास्पद बड़ी स्ट्रिंग है जिसे आप बस के लिए पर्याप्त आवंटित नहीं कर सकते हैं -Xmx
एडवर्ड सैमसन

जवाबों:


136

आप किस तरह के 'वेब' मॉड्यूल के बारे में बात कर रहे हैं? क्या यह एक साधारण युद्ध है और इसमें पैकेजिंग प्रकार का युद्ध है?

यदि आप Google के वेब टूलकिट (GWT) का उपयोग नहीं कर रहे हैं, तो आपको कोई भी प्रदान करने की आवश्यकता नहीं है gwt.extraJvmArgs

संकलन प्रक्रिया को समझना सबसे अच्छा विचार नहीं हो सकता है, क्योंकि यह एक दूसरी प्रक्रिया शुरू करता है जो MAVEN_OPTSपूरी तरह से उपेक्षा करता है , इस प्रकार विश्लेषण को और अधिक कठिन बना देता है।

इसलिए मैं MAVEN_OPTS सेट करके Xmx को बढ़ाने का प्रयास करूंगा

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। इसके अतिरिक्त, आप अपने java बिन निर्देशिका में jconsole.exe का उपयोग jvm से कनेक्ट करने के लिए कर सकते हैं, जबकि संकलन चल रहा है और देखें कि jvm के ढेर के अंदर क्या चल रहा है।

एक और आइडिया (एक बेवकूफ हो सकता है) जो मेरे पास आया था, क्या आपके पास आपकी मशीन के अंदर पर्याप्त रैम है? मेमोरी साइज़ को परिभाषित करना अच्छा है, लेकिन यदि आपके होस्ट में केवल 4GB है और तब आपको यह समस्या हो सकती है कि जावा परिभाषित मेमोरी का उपयोग करने में सक्षम नहीं है क्योंकि यह पहले से ही OS, Java, MS-Office द्वारा उपयोग किया जाता है ...


आपके जवाब के लिए धन्यवाद। क्या आपके सुझाव को कांटा गया जेवीएम को हटाने के लिए भी 'मावेन-अचायर-प्लगइन' लागू है? मैंने अपने MAVEN_OPTS मेमोरी को 3000 तक पहुंचाने के लिए आपके सुझाव की कोशिश की। मेरे maven-compiler के पास forked JVM के लिए सेटिंग नहीं थी, इसलिए मुझे वहां कुछ भी बदलने की आवश्यकता नहीं थी। और हां, मेरे गेस्ट वीएम में 4 जीबी रैम है। होस्ट मशीन में 8 जीबी रैम है।
केविन मेरेडिथ

2
वैसे, आपके सुझावों से mvn बिल्ड फिर से विफल हो गया।
केविन मेरेडिथ

1
आमतौर पर जब तक मैं इसे चालू नहीं कर देता, तब तक मैं इस प्रक्रिया से बचने की कोशिश करता हूं। यदि आपके सिस्टम में केवल 4 जीबी है तो ~ 1 जीबी का उपयोग ओएस द्वारा किया जाता है। तो आपके पास 3GB बाकी है। यदि maven Xms = 1GB से शुरू होता है, तो बाकी मुफ्त मेमोरी 2GB है। अगला संकलक कांटा Xms = 1GB के साथ शुरू हुआ .... जो मुक्त मेमोरी को 1GB तक कम कर देता है। अब आप PermGen Memory 128MB को कांट-छांट कर सकते हैं, कांटेक्ट फेलसेफ-प्लगइन प्रोसेस, ... जैसा कि आप अपने Xmx सेटिंग को देख सकते हैं कि शायद जेवीएम का उपयोग कभी नहीं किया जा सकता क्योंकि मेमोरी सरल नहीं है। क्या आपने JConsole का उपयोग करने की कोशिश की है? और HeapDumpOnOutOfMemoryError?
वच

मैंने अपने MAVEN_OPTS से Xms1024m को हटा दिया, फिर भी mvan बिल्ड अभी भी विफल रहा। मैंने अपने MAVEN_OPTS में "HeapDump ..." को जोड़ा, लेकिन मुझे यकीन नहीं है कि डंप कहाँ से प्रिंट होता है। अब JConsole में देख रहे हैं।
केविन मेरेडिथ 15

उदात्त jvms निर्देशिका में प्लेस हैं
vach

36

MAVEN_OPTSमावेन को पास करने के लिए सामान्य पर्यावरण चर के बजाय एक और विकल्प का उल्लेख करने के लिए देर से जवाब देना आवश्यक जेवीएम विकल्प का निर्माण करना है।

मावेन 3.3.1 के बाद से , आपके पास .mvnसंबंधित प्रोजेक्ट के हिस्से के रूप में एक फ़ोल्डर और jvm.configइस तरह के विकल्प के लिए एक सही जगह हो सकती है।

दो नई वैकल्पिक कॉन्फ़िगरेशन फ़ाइलें .mvn/jvm.configऔर .mvn/maven.config, प्रोजेक्ट स्रोत ट्री की बेस डायरेक्टरी में स्थित हैं। यदि मौजूद है, तो ये फाइलें डिफ़ॉल्ट jvm और maven विकल्प प्रदान करेंगी। क्योंकि ये फ़ाइलें प्रोजेक्ट स्रोत ट्री का हिस्सा हैं, वे सभी प्रोजेक्ट चेकआउट में मौजूद होंगी और प्रोजेक्ट के निर्माण के बाद हर बार स्वचालित रूप से उपयोग की जाएंगी।

आधिकारिक रिलीज नोट्स के हिस्से के रूप में

मावेन में प्रति प्रोजेक्ट बेस पर जेवीएम कॉन्फ़िगरेशन को परिभाषित करना सरल नहीं है। एक पर्यावरण चर पर आधारित मौजूदा तंत्र MAVEN_OPTSऔर का उपयोग ${user.home}/.mavenrcपरियोजना का हिस्सा नहीं होने के दोष के साथ एक अन्य विकल्प है।

इस रिलीज़ के साथ शुरू करके आप JVM कॉन्फ़िगरेशन को ${maven.projectBasedir}/.mvn/jvm.configफ़ाइल के माध्यम से परिभाषित कर सकते हैं जिसका अर्थ है कि आप प्रति प्रोजेक्ट बेस पर अपने बिल्ड के लिए विकल्पों को परिभाषित कर सकते हैं। यह फ़ाइल आपकी परियोजना का हिस्सा बन जाएगी और आपकी परियोजना के साथ जाँच की जाएगी। तो अब MAVEN_OPTS, .mavenrcफ़ाइलों के लिए कोई ज़रूरत नहीं है । उदाहरण के लिए यदि आप ${maven.projectBasedir}/.mvn/jvm.configफ़ाइल में निम्नलिखित JVM विकल्प रखते हैं :

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

इस दृष्टिकोण का मुख्य लाभ यह है कि कॉन्फ़िगरेशन संबंधित प्रोजेक्ट से अलग हो जाता है और पूरे बिल्ड पर भी लागू होता है, और MAVEN_OPTSउसी प्रोजेक्ट पर काम करने वाले अन्य डेवलपर्स की तुलना में कम नाजुक होता है (इसे स्थापित करने के लिए भूल जाता है)।
इसके अलावा, विकल्प बहु-मॉड्यूल परियोजना के मामले में सभी मॉड्यूल पर लागू होंगे।


2
ध्यान दें कि MaxPermSize नजरअंदाज कर दिया है आप JDK 8. उपयोग कर रहे हैं
GeraldScott

14

मैं एक ही समस्या को "क्लीन इंस्टाल" संकलन करने की कोशिश कर रहा था जो एक Lowend 512Mb RAM VPS और अच्छे CPU का उपयोग कर रहा था। OutOfMemory चलाएं और स्क्रिप्ट को बार-बार मारें।

मैंने इस्तेमाल किया export MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=350m"और काम किया।

अभी भी कुछ अन्य संकलन विफलता हो रही है क्योंकि मुझे पहली बार मावेन की आवश्यकता है, लेकिन आउटऑफमेरी समस्या चली गई है।


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 विकल्प जोड़ा। लेकिन मैं अभी भी मेमोरी त्रुटि से बाहर निकला। एक अन्य एसओ पोस्ट ने उल्लेख किया कि मुझे फोर्क्ड थ्रेड्स द्वारा उपयोग की जाने वाली मेमोरी को टक्कर देने के लिए maven-Surefire-plugin के argLine में एक विकल्प जोड़ने की आवश्यकता है। मैंने इसे बढ़ाकर <argLine> -Xms256m -Xmx1024m -XX: PermSize = 128m -XX: MaxPermSize = 512m </ argLine>
केविन मेरेडिथ

मुझे उल्लेख करना चाहिए कि ... नहीं, मावेन बिल्ड अभी भी विफल रहा है।
केविन मेरेडिथ

यह सभी गुण जोड़ें maven-compilier-pluginऔर बढ़ाएँ -XX:MaxPermSize, Xmxहोना चाहिए =XX:MaxPermSize
इल्या

इसके अलावा विकल्प <fork> true </ true> का उपयोग करेंmaven-compilier-plugin
Ilya

मैंने कोशिश की कि (कृपया मूल पोस्ट देखें), लेकिन मेरा mvan बिल्ड अभी भी विफल रहा।
केविन मेरेडिथ

4

Druid.io को संकलित करते समय मुझे वही समस्या हुई, जिससे MaxDirectMemorySize ने आखिरकार काम किया।

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

जिज्ञासु, MaxDirectMemorySize सामान्य रूप से डिफ़ॉल्ट रूप से अनबाउंड है (यानी आपने एक सीमा जोड़ दी है, एक preexisting समायोजित नहीं)।
तोमर गेबल

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>

-एक्सएक्स का उपयोग करने की कोशिश करें: -एक्सएक्स के बजाय मैक्सपर्माइज करें: मैक्सपर्मगेन



3

आप किस प्रकार के ओएस पर चल रहे हैं?

2GB से अधिक RAM को असाइन करने के लिए कम से कम 64bit OS होना आवश्यक है।

फिर एक और समस्या है। भले ही आपके ओएस में अनलिमिटेड रैम हो, लेकिन यह इस तरह से खंडित है कि 2 जीबी का एक भी मुफ्त ब्लॉक उपलब्ध नहीं है, आप मेमोरी अपवादों से भी बाहर निकल जाएंगे। और ध्यान रखें कि सामान्य हीप मेमोरी मेमोरी का केवल एक हिस्सा है जिसे वीएम प्रक्रिया उपयोग कर रही है। तो एक 32bit मशीन पर आप शायद कभी भी Xmx को 2048MB पर सेट नहीं कर पाएंगे।

मैं उसी मान पर एक अधिकतम मेमोरी को सेट करने का सुझाव भी दूंगा, क्योंकि इस मामले में जैसे ही वीएम मेमोरी से बाहर निकलता है, फ्रिस्ट टाइम 1 जीबी शुरू से आवंटित किया जाता है, वीएम फिर एक नया ब्लॉक आवंटित करता है (यह मानकर बढ़ता है आवंटित किए जाने के बाद 1,5GB के 500MB ब्लॉक), यह ब्लॉक एक से नए और उसके बाद की मुफ्त मेमोरी के सभी सामान की नकल करेगा। यदि यह फिर से मेमोरी से बाहर चला जाता है तो 2GB आवंटित किए जाते हैं और 1,5 GB को कॉपी किया जाता है, अस्थायी रूप से 3,5GB मेमोरी आवंटित करता है।


1

यूनिक्स / लिनक्स मंच पर परियोजना का निर्माण करते समय, नीचे के रूप में मावेन विकल्प सिंटैक्स सेट करें। ध्यान दें कि एकल कटआउट संकेत, डबल qoutation नहीं।

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

0

.Mvn / jvm.config का उपयोग करना मेरे लिए काम करता है और परियोजना के साथ जुड़े होने का अतिरिक्त लाभ है।


0

यह विंडोज पर बड़ी परियोजनाओं में होता है जब साइबरविन या अन्य लिनक्स एमुलेटर का उपयोग किया जाता है (गिट बैश)। कुछ संयोग से, दोनों मेरे प्रोजेक्ट पर काम नहीं करते हैं, एक बड़ा ओपन सोर्स प्रोजेक्ट क्या है। एक sh स्क्रिप्ट में, mvan कमांड के एक जोड़े को बुलाया जाता है। मेमोरी का आकार बड़े आकार के ढेर के लिए बढ़ता है जो एक्सएमएक्स में निर्दिष्ट होता है और ज्यादातर समय एक मामले में दूसरी विंडोज़ प्रक्रिया शुरू होती है। यह मेमोरी की खपत को और अधिक बढ़ा रहा है।

इस मामले में समाधान बैच फ़ाइल और कम एक्सएमएक्स आकार का उपयोग करना है और फिर मावेन संचालन सफल होते हैं। यदि रुचि है तो मैं अधिक विवरण प्रकट कर सकता हूं।


0

किसी ने पहले ही 32 बिट ओएस के साथ समस्या का उल्लेख किया है। मेरे मामले में समस्या यह थी कि मैं 32 बिट JDK का संकलन कर रहा था।


0

पर्यावरण चर 'MAVEN_OPTS' में मेमोरी का आकार बढ़ाने से इस समस्या को हल करने में मदद मिलेगी। मेरे लिए, -Xmx756M से -Xmx1024M को बढ़ाने पर काम किया गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.