Java.lang.OutOfMemoryError को कैसे रोकें: स्काला संकलन में पर्मजेन स्पेस?


79

मैंने अपने स्कैला संकलक के एक अजीब व्यवहार पर ध्यान दिया है। यह कभी-कभी एक वर्ग का संकलन करते समय एक OutOememoryError को फेंक देता है। यहाँ त्रुटि संदेश है:

[info] Compiling 1 Scala source to /Users/gruetter/Workspaces/scala/helloscala/target/scala-2.9.0/test-classes...
java.lang.OutOfMemoryError: PermGen space
Error during sbt execution: java.lang.OutOfMemoryError: PermGen space

यह केवल एक बार एक समय में होता है और त्रुटि आमतौर पर बाद के संकलन रन पर नहीं डाली जाती है। मैं स्केल 2.9.0 का उपयोग करता हूं और एसबीटी के माध्यम से संकलन करता हूं।

क्या किसी के पास कोई सुराग है कि इस त्रुटि का कारण क्या हो सकता है? आपकी अंतर्दृष्टि के लिए अग्रिम धन्यवाद।


java.lang.OutOfMemoryError: Metaspaceयदि आप के MaxPermSizeसाथ प्रतिस्थापित करते हैं, तो यहां उत्तर भी (जावा 8 पर चल रहे स्काला के लिए समतुल्य समस्या) के लिए काम करते हैं MaxMetaspaceSize
बजे ब्रायन मैककिनटन

जवाबों:


46

इसका कारण OutOfMemoryError: PermGen spaceयह है कि इसमें पर्याप्त स्थायी पीढ़ी का स्थान नहीं है :) यदि आप ओरेकल जेवीएम का उपयोग कर रहे हैं, तो आपको -XX:MaxPermSize=256Mअपनी sbtस्क्रिप्ट में तर्क (या कुछ अन्य राशि) को जोड़ने की आवश्यकता है । अन्य JVM के लिए, उनके दस्तावेज़ देखें।


1
धन्यवाद एलेक्सी। मैंने पहले से ही -Xmx512M विकल्प का उपयोग किया है। मुझे लगता है कि एक ही प्रभाव होना चाहिए, है ना? मैंने -XX जोड़ा है: फिर भी MaxPermSize पैरामीटर को फिर से देखें और देखें कि क्या त्रुटि बनी रहती है।
भौंरागी

3
@BumbleGee नहीं, द्वारा जोड़ी गई मेमोरी -Xmxको PermGen के लिए उपयोग नहीं किया जा सकता है।
एलेक्सी रोमानोव

स्पष्ट करने के लिए धन्यवाद कि, एलेक्स।
भौंरा

6
यह एसबीटी में एक मेमोरी लीक की तरह दिखता है क्योंकि प्रोग्राम कंपाइल करता है और एसबीटी रीस्टार्ट द्वारा तय किए गए अपवाद को फेंकने से पहले लगभग 3-5 बार सुसाइड करता है।
इवान

4
के वर्तमान संस्करण के लिए sbtआप की जरूरत -J-XX:MaxPermSize=256Mके बजाय -XX:MaxPermSize=256M। तवरोह का उत्तर अधिक सटीक और पूर्ण है, साथ ही यह प्रश्न का मजाक नहीं उड़ाता है।
डैनियल डारबोस

99

मैं OSB पर sbt को स्थापित करने के लिए HomeBrew का उपयोग करता हूं। यह एक SBT_OPTSतर्क का समर्थन करता है जिसे ~/.sbtconfigफ़ाइल में रखा जा सकता है export SBT_OPTS=-XX:MaxPermSize=256M


1
SBT के साथ विकसित होने पर Homebrew एक बहुत प्रबंधनीय पैकेज समाधान लगता है। :)
crockpotveggies

sbt brew इंस्टॉल स्क्रिप्ट सेट मेमोरी मैक्स बहुत छोटा है, jX में xXx512M से छुटकारा पाएं - बिल्ली which sbt#! / बिन / श टेस्ट -f ~ / .sbtconfig &&। ~ / .sbtconfig कार्यकारी जावा -Xmx512M $ {SBT_OPTS} जार /usr/local/Cellar/sbt/0.13.1/libexec/sbt-launch.jar "$ @"
ski_squaw


मेरे लिए विंडोज़ सेट SBT_OPTS = -XX पर काम किया: MaxPermSize = 512M
एलेक्स पुन्नेन

Use of ~/.sbtconfig is deprecated, please migrate global settings to /usr/local/etc/sbtopts, Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0

36

मैंने मान लिया कि आप sbt 0.13.6 या उच्चतर का उपयोग कर रहे हैं । निम्न सामग्री के साथ .sbtoptsअपने sbt प्रोजेक्ट के रूट में फ़ाइल बनाएँ :

-J-Xmx4G
-J-XX:MaxMetaspaceSize=1G
-J-XX:MaxPermSize=1G
-J-XX:+CMSClassUnloadingEnabled

MaxMetaspaceSizeजावा 8 के लिए है, जबकि MaxPermSizeजावा 7 के लिए है। वे मेमोरी त्रुटियों से संबंधित होने से रोकने के लिए महत्वपूर्ण हैं जो कि परमिट या मेटासैपेस थकावट से संबंधित हैं । बेशक, झंडे के मूल्यों को अपनाने या किसी अन्य झंडे को जोड़ने पर विचार करें।

अधिक विवरण और वैकल्पिक दृष्टिकोण इस ब्लॉग पोस्ट में पाए जा सकते हैं ।


महान। आप इन विकल्पों को अपनी वैश्विक कॉन्फ़िगरेशन फ़ाइल में भी डाल सकते हैं; मेरे लिए यह /usr/local/etc/sbtoptsमैक पर Homebrew के साथ स्थापित sbt के लिए) है।
ब्रायन मेकचून

5

मेरे पास यह मुद्दा था, स्मृति के आकार को बदलने की कोशिश कर रही साइटों को देखने के लिए 10 मिनट तक इसके साथ खेला गया।

बाहर मुड़ता है मैं इसे द्वारा हल,

user-profile$ sbt

फिर,

sbt-project-name 0.1> clean

यह मेरे लिए इसे मंजूरी दे दी।


4

यह मेरे लिए एसबीटी में एक स्मृति रिसाव की तरह दिखता है क्योंकि मेरे मामले में कार्यक्रम संकलन करता है और एसबीटी पुनरारंभ द्वारा तय किए गए अपवाद को मारने से पहले लगभग 3-5 बार सफलतापूर्वक चलता है।

सबसे पर्याप्त समाधान वास्तव में -XX:MaxPermSize=जेवीएम पैरामीटर के रूप में प्रतीत होता है क्योंकि एलेक्सी रोमानोव सुझाव देता है या एसबीटी को समय-समय पर पुनः आरंभ करता है यदि यह मदद करता है।

लेकिन एक और दिलचस्प तरीका है: जावा 8 पर स्विच करने का प्रयास करें । AFAIK यह किसी भी अधिक PermGen का उपयोग नहीं करता है और शायद इस तरह इस अपवाद के लिए प्रतिरक्षा है।

मुझे अभी भी उम्मीद है कि एसबीटी लेखक भविष्य के संस्करणों में इस मुद्दे को संबोधित करेंगे।


तो जावा 8 एक अलग मेमोरी सिस्टम का उपयोग करता है?
एड्रियन

J8 में पर्म जीन को सिर्फ मेमोरी हीप स्पेस में रोल किया जाता है।
स्केसमूएल

जावा 8 के साथ एसबीटी संकलन करने में विफल रहता है, कम से कम मेरे मैक पर। मुझे जावा 7.
सियुआन रेन

शायद आप कुछ गलत कर रहे हैं, @CR जहाँ तक मुझे याद है मैंने इसे लिनक्स पर Java 8 के साथ उस समय (जब यह गहरे बीटा में था) की कोशिश की है, कोई दृश्य समस्या नहीं है, तो अभी इसे विंडोज 8 पर जावा 8 के साथ उपयोग कर रहा हूँ। शायद आप हमें कंपाइलर त्रुटि संदेश दिखा सकते हैं?
इवान

मदद के लिए प्रस्ताव के लिए धन्यवाद, लेकिन मैंने फिर से जटिल प्रक्रिया से नहीं गुजरने का फैसला किया। मैं फिलहाल जावा 7 से चिपका रहूंगा।
सियान रेन

2

मैं जेनकिन्स sbt प्लगइन के साथ निर्माण कर रहा हूं और उसी तरह की समस्याएं थीं। SBT_OPTS को sbt फ़ाइल से जेनकिंस जॉब कॉन्फिगर के JVM झंडे में कॉपी करने के बाद हल किया गया।


2

मूल रूप से एक कमांड का उपयोग कर जैसे:

java -jar /path/to/sbt-launch.jar test

मुझे पहला OutOfMemoryError मिला: PermGen space जिसे मैंने इस्तेमाल करके हल किया -XX:MaxPermSize, और फिर OutOfMemoryError: Java हीप स्पेस , जिसका -Xmxउपाय था।

तो मेरे मामले में, इस तरह के एक कमांड ने काम किया:

java -XX:MaxPermSize=256M -Xmx2048M -jar /path/to/sbt-launch.jar test

0

sbt.sh फ़ाइल में कोड ब्लॉक के बाद परिवर्तन करें और इसके कामकाज को ठीक करें।

get_mem_opts () {
  local mem=${1:-1536}
  local perm=$(( $mem / 4 ))
  (( $perm > 256 )) || perm=1024 //256 to 1024
  (( $perm < 1024 )) || perm=2048 // 1024 to 2048
  local codecache=$(( $perm / 2 ))

  echo "-Xms${mem}m -Xmx${mem}m -XX:MaxPermSize=${perm}m -XX:ReservedCodeCacheSize=${codecache}m"
}

या

टर्मिनल का उपयोग sbt config निर्यात करने के लिए

export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.