จะระบุขนาดฮีพสูงสุดของ JVM“ -Xmx” สำหรับเรียกใช้แอปพลิเคชันที่มีการดำเนินการ“ รัน” ใน SBT ได้อย่างไร


98

แอปพลิเคชันของฉันทำการประมวลผลอาร์เรย์ข้อมูลขนาดใหญ่และต้องการหน่วยความจำมากกว่าที่ JVM มอบให้ตามค่าเริ่มต้น ฉันรู้ว่าใน Java ระบุโดยตัวเลือก "-Xmx" ฉันจะตั้งค่า SBT ให้ใช้ค่า "-Xmx" เฉพาะเพื่อเรียกใช้แอปพลิเคชันด้วยการดำเนินการ "รัน" ได้อย่างไร

คำตอบ:


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
@iwein เนื้อหาในโพสต์ของฉันดูเหมือนจะสำคัญมากสำหรับคุณ
Arne

2
โปรดทราบว่าjavaOptionsมีเพียงผลสำหรับ JVMs คดเคี้ยว (ดูscala-sbt.org/0.13/docs/Forking.html )
Yar

1
เพิ่มfork in run := ture เปิดใช้งานjavaOptions
coanor

@coanor คำตอบนี้สำหรับ sbt รุ่นโบราณ มีคำตอบที่มีการจัดอันดับที่สูงขึ้นมากภายใต้คำตอบนี้ คำตอบนี้เป็นคำตอบที่ถูกต้องในเวลาที่ถามคำถาม
Arne

115

สำหรับกระบวนการแยกคุณควรดูที่ Build.scala

ในการแก้ไขอ็อพชัน java สำหรับกระบวนการที่แยกคุณต้องระบุใน Build.scala (หรืออะไรก็ตามที่คุณตั้งชื่อบิวด์ของคุณ) ดังนี้:

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

สิ่งนี้จะให้ตัวเลือกที่เหมาะสมแก่คุณโดยไม่ต้องแก้ไข JAVA_OPTS ทั่วโลกและจะใส่ JAVA_OPTS ที่กำหนดเองไว้ในสคริปต์เริ่มต้นที่สร้างขึ้น sbt

สำหรับกระบวนการที่ไม่ใช่ทางแยกจะสะดวกที่สุดในการตั้งค่าผ่านsbtoptsหรือsbtconfigขึ้นอยู่กับเวอร์ชัน sbt ของคุณ

ตั้งแต่ 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. ตั้งค่าตัวเลือก jvm ที่ถูกต้องเพื่อป้องกัน OOM (ทั้งปกติและ PermGen):

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

หากคุณต้องการตั้งค่า SBT_OPTS สำหรับการรัน sbt ปัจจุบันเท่านั้นคุณสามารถใช้ได้env SBT_OPTS=".." sbtตามที่ Googol Shan แนะนำ หรือคุณสามารถใช้ตัวเลือกที่เพิ่มเข้ามาใน Sbt sbt -mem 204812: สิ่งนี้จะไม่สะดวกสำหรับรายการตัวเลือกที่ยาวขึ้น แต่อาจช่วยได้หากคุณมีโครงการต่างๆที่มีความต้องการที่แตกต่างกัน

โปรดทราบว่า CMSClassUnloadingEnabled ร่วมกับ UseConcMarkSweepGC ช่วยรักษาพื้นที่ PermGen ให้สะอาด แต่ขึ้นอยู่กับกรอบงานที่คุณใช้คุณอาจมีการรั่วไหลจริงบน PermGen ซึ่งจะบังคับให้รีสตาร์ทในที่สุด


@iwein - javaOptions ไม่ได้เปลี่ยน heapspace เริ่มต้นสำหรับ sbt ฉันเช็คอิน jconsole แล้วมันก็แสดง -Xmx512M แม้ว่าฉันจะเพิ่ม SBT_OPTS ใน ~ / .sbtconfig แต่ฉันก็ยังได้รับสิ่งนี้ใน jconsole: -Xmx512M -Xms256M -Xmx1G -XX: MaxPermSize = 256M -XX: + UseConcMarkSweepGC คุณเห็น Xmx512 อยู่ด้านหน้าหรือไม่? บางวิธีไม่เลือก javaOptions จาก Build.scala คำแนะนำใด ๆ
Anand

@Anand บางทีสิ่งต่าง ๆ จะทำงานแตกต่างกันเล็กน้อยใน 0.13? ฉันจะอัปเดตคำตอบหากฉันชนอะไร (อาจใช้เวลาสักครู่) โปรดแจ้งให้เราทราบหากคุณคิดออกในช่วงเวลาดังกล่าว
iwein

@iwein ฉันเพิ่งใช้สิ่งต่อไปนี้ใน Build.scala ของฉันและมันใช้งานได้ ส้อมในการรัน: = true, javaOptions ในการรัน ++ = Seq ("- Xms256m", "-Xmx2048m", "-XX: + UseConcMarkSweepGC") ดูโพสต์นี้สำหรับคำตอบstackoverflow.com/questions/27372468/… . ขอบคุณ!
อานันท์

2
FYI คุณยังสามารถสร้าง.sbtoptsไฟล์ในรูทของโปรเจ็กต์ SBT ของคุณโดยใช้ไวยากรณ์เดียวกับใน/usr/local/etc/sbtoptsไฟล์ สิ่งนี้ทำให้โครงการของคุณมีอยู่ในตัวซึ่งจะมีประโยชน์มากในสถานการณ์ CI
อายุ Mooij

บน Windows โดยใช้ 0.13.9 (อาจเป็น 0.13.6) ไฟล์คือ C: \ Program Files (x86) \ sbt \ conf \ sbtconfig.txt โดยค่าเริ่มต้นไฟล์จะมี "-Xmx512M" อยู่ในนั้นโดยไม่มี -J แสดงในคำตอบนี้ ฉันสามารถยืนยันได้ว่าไฟล์นี้ถูกอ่านโดยข้อเท็จจริงที่ว่าแอสเซมบลี sbt ออกคำเตือนเกี่ยวกับ -XX: MaxPermSize และเมื่อฉันเปลี่ยนค่านั้นคำเตือนจะแสดงค่าที่ฉันป้อนไม่ใช่ค่า "256m" ที่แสดงในตอนแรก
Night Owl

69

ใน sbt เวอร์ชัน 12 เป็นต้นไปมีตัวเลือกสำหรับสิ่งนี้:

$sbt -mem 2048 

5
ใน win 8.1 คำสั่งนี้ใช้ไม่ได้สำหรับฉัน:Not a valid command: mem (similar: set)
Kevin Meredith

43

หากคุณรัน sbt บน linux shell คุณสามารถใช้:

env JAVA_OPTS="-Xmx512m" sbt run

นี่คือคำสั่งที่ฉันมักใช้เพื่อรันโปรเจ็กต์ sbt


1
ขอบคุณมาก. คำสั่งเด็ดที่ควรรู้ ฉันไม่เคยรู้จัก "env" และพลาดเครื่องมือดังกล่าวหลายครั้ง
Ivan

4
อืมมันไม่ได้ผลสำหรับฉัน! ฉันต้องการoverride def forkวิธีแก้ปัญหาข้างต้น (sbt 0.7.7)
Scott Morrison

2
เป็นไปได้ว่าไฟล์ sbt ของคุณระบุ JAVA_OPTS ของตัวเองซึ่งในกรณีนี้จะถูกเขียนทับ จากนั้นคุณสามารถแก้ไขไฟล์ sbt ของคุณได้โดยตรงไม่ว่าจะเพื่อลบแฟล็ก -Xmx หรือเปลี่ยนเป็นขนาดฮีปสูงสุดที่คุณต้องการ
nnythm

23

.sbtconfigจะเลิกเริ่มต้นด้วย 0.13.6SBT แต่ฉันกำหนดค่าตัวเลือกเหล่า/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 ดูเหมือนจะปลอดภัยกว่า
Marius Soutier

7

มีวิธีหนึ่งที่ฉันรู้ ตั้งค่าตัวแปรสภาพแวดล้อม JAVA_OPTS

JAVA_OPTS='-Xmx512m'

ฉันไม่พบวิธีทำสิ่งนี้เป็นพารามิเตอร์คำสั่ง


7

ใช้ JAVA_OPTS สำหรับการตั้งค่าด้วยตัวแปรสภาพแวดล้อม

ใช้อ็อพชัน -JX เพื่อ sbt สำหรับแต่ละอ็อพชันเช่น -J-Xmx2048 -J-XX: MaxPermSize = 512

sbt เวอร์ชันใหม่กว่ามีตัวเลือก "-mem"


5

javaOptions += "-XX:MaxPermSize=1024"ใน build.sbt ของเราเป็นอ้างอิงโดย @iwein ข้างต้นไม่ได้สำหรับเราเมื่อเราได้เห็น java.lang.OutOfMemoryError โยนขณะที่กำลังวิ่งทดสอบ Specs2 ผ่าน SBT


1
@UwePlonus มันตอบคำถาม
VasiliNovikov

3

ตัวแปรสภาพแวดล้อมคือ _JAVA_OPTIONS ซึ่งจำเป็นต้องตั้งค่า เมื่อคุณตั้งค่า _JAVA_OPTIONS และเมื่อคุณ sbt sbt จะแสดงข้อความโดยใช้ JAVA_OPTIONS และค่า

หรือคุณสามารถตั้งค่า javaOption ในไฟล์ sbt หรือ. scala เช่น

javaOptions += "-Xmx1G"

จาก sbt shell คุณสามารถเรียกใช้ show javaOptions เพื่อดูค่าที่ตั้งไว้


1
    javaOptions in Test += "-Xmx1G"

สิ่งนี้ตั้งค่าตัวเลือก JVM สำหรับการทดสอบ ใช้งานได้กับ jvm forking ( fork in Test := true)


1
ชุดนี้อยู่build.sbtที่ไหน?
javadba

ทุกที่ถ้าคุณมีโครงการ 1 โมดูล โดยทั่วไปลำดับของคำจำกัดความไม่สำคัญใน SBT หากคุณมีโมดูลหลายโมดูลให้ระบุสิ่งนี้ในบางโมดูลหรือหากคุณต้องการทั่วโลกผ่านjavaOptions in ThisBuild += "-Xmx1G"หรือjavaOptions in (ThisBuild, Test) += "-Xmx1G"
VasiliNovikov

1

sbt ช่วยให้คุณแสดงรายการตัวเลือก JVM ที่คุณต้องการเพื่อเรียกใช้โครงการของคุณในไฟล์ชื่อ

.jvmopts

ในรากของโครงการของคุณ จากนั้นเพิ่มตัวเลือก java ที่คุณต้องการ

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

ได้รับการทดสอบและใช้งานได้ใน Windows 10 https://www.lagomframework.com/documentation/1.4.x/scala/JVMMemoryOnDev.html

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