एसबीटी में "रन" कार्रवाई के साथ एक आवेदन चलाने के लिए जेवीएम अधिकतम ढेर आकार "-एक्सएमएक्स" कैसे निर्दिष्ट करें?


98

मेरा एप्लिकेशन बड़े डेटा एरेज़ को संसाधित करता है और डिफ़ॉल्ट रूप से जेवीएम की तुलना में अधिक मेमोरी की आवश्यकता होती है। मुझे पता है कि जावा में यह "-Xmx" विकल्प द्वारा निर्दिष्ट है। मैं "रन" कार्रवाई के साथ एक एप्लिकेशन चलाने के लिए विशेष "-Xmx" मान का उपयोग करने के लिए SBT कैसे सेट करूं?

जवाबों:


17

इसे इस्तेमाल करे:

class ForkRun(info: ProjectInfo) extends DefaultProject(info) {
    override def fork = Some(new ForkScalaRun {
        override def runJVMOptions = super.runJVMOptions ++ Seq("-Xmx512m")
        override def scalaJars = Seq(buildLibraryJar.asFile, buildCompilerJar.asFile)
    })
}

53
यह पुराना है, अब आप उपयोग कर सकते हैंjavaOptions += "-Xmx1G"
iwein

1
@ मेरी पोस्ट की सामग्री आपको बहुत महत्वपूर्ण लगती है।
Arne

2
ध्यान दें कि javaOptionsकेवल forked JVMs के लिए प्रभाव है (देखें) scala-sbt.org/0.13/docs/Forking.html )
यार

1
fork in run := ture सक्षम जोड़ेंjavaOptions
कुन्नूर

@coanor यह उत्तर sbt के एक प्राचीन संस्करण के लिए है। इस एक के तहत बहुत अधिक रैंकिंग के साथ एक उत्तर है। यह उत्तर उस समय सही उत्तर था जब प्रश्न पूछा गया था।
Arne

113

कांटे की प्रक्रियाओं के लिए आपको Build.scala को देखना चाहिए

कांटे की प्रक्रियाओं के लिए जावा विकल्पों को संशोधित करने के लिए आपको उन्हें Build.scala में निर्दिष्ट करने की आवश्यकता है (या जो आपने अपने बिल्ड का नाम दिया है) जैसे:

val buildSettings = Defaults.defaultSettings ++ Seq(
   //…
   javaOptions += "-Xmx1G",
   //…
)

यह आपको विश्व स्तर पर JAVA_OPTS को संशोधित किए बिना उचित विकल्प देगा , और यह कस्टम JAVA_OPTS को एक sbt जनरेट की गई स्टार्ट-स्क्रिप्ट में डाल देगा।

के लिए गैर काँटेदार प्रक्रियाओं यह के माध्यम से config स्थापित करने के लिए सबसे सुविधाजनक है sbtoptsया sbtconfigअपने एसबीटी संस्करण के आधार पर।

चूंकि sbt 0.13.6 है .sbtconfig पदावनत है/usr/local/etc/sbtoptsइन पंक्तियों के साथ संशोधित करें :

-J-Xms512M
-J-Xmx3536M
-J-Xss1M
-J-XX:+CMSClassUnloadingEnabled
-J-XX:+UseConcMarkSweepGC
-J-XX:MaxPermSize=724M
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

आप.sbtopts फ़ाइल के समान सिंटैक्स का उपयोग करके अपने SBT प्रोजेक्ट की जड़ में एक फ़ाइल भी बना सकते हैं/usr/local/etc/sbtopts । यह परियोजना को आत्म-निहित बनाता है।

Sbt से पहले 0.13.6 आप गैर कांटा प्रक्रियाओं के लिए .sbtconfig में विकल्प सेट कर सकते हैं:

  1. जाँच करें कि sbt कहाँ है:

    $ which sbt
    /usr/local/bin/sbt
  2. सामग्री को देखो:

    $ cat /usr/local/bin/sbt
    #!/bin/sh
    test -f ~/.sbtconfig && . ~/.sbtconfig
    exec java ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.1/libexec/sbt-launch.jar "$@"
  3. OOM (नियमित और PermGen दोनों) को रोकने के लिए सही jvm विकल्प सेट करें:

    $ cat ~/.sbtconfig
    SBT_OPTS="-Xms512M -Xmx3536M -Xss1M 
     -XX:+CMSClassUnloadingEnabled 
     -XX:+UseConcMarkSweepGC -XX:MaxPermSize=724M"

यदि आप SBT_OPTS को केवल sbt के वर्तमान रन के लिए सेट करना चाहते हैं, तो आप Googol env SBT_OPTS=".." sbtShan द्वारा सुझाए गए अनुसार उपयोग कर सकते हैं । या आप Sbt 12 में जोड़े गए विकल्प का उपयोग कर सकते हैं:sbt -mem 2048 :। यह विकल्पों की लंबी सूची के लिए अनिच्छुक हो जाता है, लेकिन यदि आपके पास विभिन्न आवश्यकताओं के साथ अलग-अलग परियोजनाएं हैं, तो यह मदद कर सकता है।

ध्यान दें कि UseConcMarkSweepGC के साथ कॉन्सर्ट में CMSClassUnloadingEnabled PermGen स्पेस को साफ रखने में मदद करता है, लेकिन आप जो फ्रेमवर्क इस्तेमाल करते हैं, उसके आधार पर आपको PermGen पर एक वास्तविक लीक हो सकता है, जो अंततः एक पुनरारंभ करता है।


@ आईवेइन - javaOptions ने sbt के लिए डिफ़ॉल्ट हेपस्पेस नहीं बदला। मैंने jconsole में चेक किया और यह सिर्फ दिखाता है -Xmx512M। यहां तक ​​कि अगर मैं SBT_OPTS को ~ / .sbtconfig में जोड़ता हूं, तो भी मैं इसे अभी भी jconsole में प्राप्त करता हूं: -Xmx512M -Xms256M -Xmx1G -XX: MaxPermSm = 256M -XX: + UseConcMarkSweepGC। क्या आपको सामने Xmx512 दिखाई देता है? यह कुछ कैसे Build.scala से javaOptions नहीं उठाता है। कोई संकेत?
आनंद

@ और शायद चीजें 0.13 में थोड़ा अलग तरीके से काम कर रही हैं? अगर मैं किसी चीज से टकराता हूं, तो मैं जवाब को अपडेट करूंगा (मुझे थोड़ी देर लग सकती है), मुझे बताएं कि क्या आप इसे माध्य समय में समझेंगे।
इविन

@ आईवेइन मैंने सिर्फ अपने Build.scala में निम्नलिखित का उपयोग किया और यह काम किया। fork in run: = true, javaOptions in run ++ = Seq ("- Xms256m", "-Xmx2048m", "-XX: + UseConcMarkSweepGC")। उत्तर के लिए इस पोस्ट को देखें stackoverflow.com/questions/27372468/… । धन्यवाद!
आनंद

2
FYI करें आप .sbtoptsफ़ाइल के समान सिंटैक्स का उपयोग करके अपने SBT प्रोजेक्ट की जड़ में एक फ़ाइल भी बना सकते हैं /usr/local/etc/sbtopts। यह आपकी परियोजना को आत्म-निहित बनाता है, जो CI स्थितियों में बहुत काम आ सकता है।
आयु मोइज

0.13.9 का उपयोग कर विंडोज पर (0.13.6 हो सकता है) फ़ाइल C: \ Program Files (x86) \ sbt \ conf \ sbtconfig.txt है। डिफ़ॉल्ट रूप से फ़ाइल में "-Xmx512M" था, जिसमें इस उत्तर में -J दिखाए बिना नहीं था। मैं इस बात की पुष्टि कर सकता हूं कि यह फाइल इस तथ्य से पढ़ी जा रही है कि sbt असेंबली एक चेतावनी -XX के बारे में चेतावनी जारी करती है: MaxPermSize और जब मैं बदलता हूं कि मूल्य उस चेतावनी को दर्शाता है जो मैंने दर्ज की है और "256m" मान को मूल रूप से नहीं दिखाया गया है।
रात उल्लू


43

यदि आप लिनक्स शेल पर sbt चलाते हैं, तो आप उपयोग कर सकते हैं:

env JAVA_OPTS="-Xmx512m" sbt run

यह मेरे sbt प्रोजेक्ट को चलाने के लिए आमतौर पर उपयोग की जाने वाली कमांड है।


1
आपका बहुत बहुत धन्यवाद। जानने के लिए एक अच्छी कमांड। मैं उस "एनवी" के बारे में कभी नहीं जानता था और कई बार ऐसे उपकरण से चूक गया था।
इवान

4
हम्म, यह मेरे लिए काम नहीं किया! मुझे override def forkऊपर के समाधान की आवश्यकता थी । (sbt 0.7.7)
स्कॉट मॉरिसन

2
यह संभव है कि आपकी sbt फ़ाइल अपने स्वयं के JAVA_OPTS को निर्दिष्ट करती है, जिस स्थिति में ये ओवरराइट किए जाएंगे। फिर आप अपनी sbt फ़ाइल को सीधे संशोधित कर सकते हैं, या तो -Xmx ध्वज को हटाने के लिए या इसे अपने इच्छित अधिकतम हीप आकार में बदलने के लिए।
मई

23

.sbtconfigएसबीटी के साथ शुरू किया गया पदावनत है 0.13.6। इसके बजाय, मैंने इन विकल्पों /usr/local/etc/sbtoptsको निम्न तरीके से कॉन्फ़िगर किया है :

-J-Xms512M
-J-Xmx3536M
-J-Xss1M
-J-XX:+CMSClassUnloadingEnabled
-J-XX:+UseConcMarkSweepGC
-J-XX:MaxPermSize=724M
-J-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

1
-J-Xss1Mबड़े मामलों की कक्षाओं के लिए थोड़ा कम है, 4M अधिक सुरक्षित लगता है।
मैरियस साउथियर

7

एक तरीका है जिससे मैं जानता हूं। पर्यावरण चर JAVA_OPTS सेट करें।

JAVA_OPTS='-Xmx512m'

मुझे कमांड पैरामीटर के रूप में ऐसा करने का कोई तरीका नहीं मिला है।


7

पर्यावरण चर के साथ सेटिंग के लिए JAVA_OPTS का उपयोग करें।

व्यक्तिगत विकल्पों के लिए sbt का उपयोग करें -JX विकल्प, जैसे -J-Xmx2048 -J-XX: MaxPermSize = 512

Sbt के नए संस्करणों में "-mem" विकल्प है।


5

javaOptions += "-XX:MaxPermSize=1024"हमारे build.sbt में के लिए काम किया है जब हम एक java.lang.OutOfMemoryError जबकि एसबीटी के माध्यम से Specs2 परीक्षण चलाने फेंका को देख रहे थे ऊपर @iwein द्वारा संदर्भित के रूप में।


1
@ यूवेप्लोनस यह सवाल का जवाब देता है।
VasiliNovikov

3

पर्यावरण चर _JAVA_OPTIONS है, जिसे सेट करने की आवश्यकता है। एक बार जब आप _JAVA_OPTIONS सेट करते हैं, और जब आप sbt करते हैं, तो sbt JAVA_OPTIONS और मानों का उपयोग करके संदेश दिखाएगा।

वैकल्पिक रूप से आप sbt या .scala फ़ाइल में javaOption सेट कर सकते हैं

javaOptions += "-Xmx1G"

Sbt शेल से आप निर्धारित मूल्यों को देखने के लिए javaOptions को चला सकते हैं।


1
    javaOptions in Test += "-Xmx1G"

यह परीक्षण के लिए जेवीएम विकल्प सेट करता है। जेवीएम फोर्किंग ( fork in Test := true) के साथ भी काम करता है ।


1
यह कहाँ पर सेट है build.sbt?
जावदबा

कहीं भी, यदि आपके पास 1-मॉड्यूल प्रोजेक्ट है। एसबीटी में परिभाषाओं का क्रम आम तौर पर मायने नहीं रखता है। यदि आपके पास कई मॉड्यूल हैं, तो इसे या तो उनमें से कुछ पर निर्दिष्ट करें या, यदि आप चाहते हैं, तो विश्व स्तर पर javaOptions in ThisBuild += "-Xmx1G"याjavaOptions in (ThisBuild, Test) += "-Xmx1G"
VasiliNovikov

1

sbt आपको JVM विकल्पों को सूचीबद्ध करने देता है जिन्हें आपको अपनी परियोजना को नाम की फ़ाइल पर चलाने की आवश्यकता है

.jvmopts

अपने प्रोजेक्ट की जड़ में। फिर आप चाहते हैं कि जावा विकल्प जोड़ें

cat .jvmopts
-Xms512M
-Xmx4096M
-Xss2M
-XX:MaxMetaspaceSize=1024M

यह परीक्षण किया गया है और विंडोज़ 10 में काम करता है https://www.lagomframework.com/documentation/1.4.x/scala/JVMMemoryOnDev.html

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