แอปพลิเคชันของฉันทำการประมวลผลอาร์เรย์ข้อมูลขนาดใหญ่และต้องการหน่วยความจำมากกว่าที่ JVM มอบให้ตามค่าเริ่มต้น ฉันรู้ว่าใน Java ระบุโดยตัวเลือก "-Xmx" ฉันจะตั้งค่า SBT ให้ใช้ค่า "-Xmx" เฉพาะเพื่อเรียกใช้แอปพลิเคชันด้วยการดำเนินการ "รัน" ได้อย่างไร
แอปพลิเคชันของฉันทำการประมวลผลอาร์เรย์ข้อมูลขนาดใหญ่และต้องการหน่วยความจำมากกว่าที่ JVM มอบให้ตามค่าเริ่มต้น ฉันรู้ว่าใน Java ระบุโดยตัวเลือก "-Xmx" ฉันจะตั้งค่า SBT ให้ใช้ค่า "-Xmx" เฉพาะเพื่อเรียกใช้แอปพลิเคชันด้วยการดำเนินการ "รัน" ได้อย่างไร
คำตอบ:
ลองสิ่งนี้:
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)
})
}
javaOptions
มีเพียงผลสำหรับ JVMs คดเคี้ยว (ดูscala-sbt.org/0.13/docs/Forking.html )
fork in run := ture
เปิดใช้งานjavaOptions
สำหรับกระบวนการแยกคุณควรดูที่ 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 สำหรับกระบวนการที่ไม่ได้แยก :
ตรวจสอบว่า sbt อยู่ที่ไหน:
$ which sbt
/usr/local/bin/sbt
ดูเนื้อหา:
$ 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 "$@"
ตั้งค่าตัวเลือก 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 2048
12: สิ่งนี้จะไม่สะดวกสำหรับรายการตัวเลือกที่ยาวขึ้น แต่อาจช่วยได้หากคุณมีโครงการต่างๆที่มีความต้องการที่แตกต่างกัน
โปรดทราบว่า CMSClassUnloadingEnabled ร่วมกับ UseConcMarkSweepGC ช่วยรักษาพื้นที่ PermGen ให้สะอาด แต่ขึ้นอยู่กับกรอบงานที่คุณใช้คุณอาจมีการรั่วไหลจริงบน PermGen ซึ่งจะบังคับให้รีสตาร์ทในที่สุด
.sbtopts
ไฟล์ในรูทของโปรเจ็กต์ SBT ของคุณโดยใช้ไวยากรณ์เดียวกับใน/usr/local/etc/sbtopts
ไฟล์ สิ่งนี้ทำให้โครงการของคุณมีอยู่ในตัวซึ่งจะมีประโยชน์มากในสถานการณ์ CI
ใน sbt เวอร์ชัน 12 เป็นต้นไปมีตัวเลือกสำหรับสิ่งนี้:
$sbt -mem 2048
Not a valid command: mem (similar: set)
หากคุณรัน sbt บน linux shell คุณสามารถใช้:
env JAVA_OPTS="-Xmx512m" sbt run
นี่คือคำสั่งที่ฉันมักใช้เพื่อรันโปรเจ็กต์ sbt
override def fork
วิธีแก้ปัญหาข้างต้น (sbt 0.7.7)
.sbtconfig
จะเลิกเริ่มต้นด้วย 0.13.6
SBT แต่ฉันกำหนดค่าตัวเลือกเหล่า/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
-J-Xss1M
ค่อนข้างต่ำสำหรับคลาสเคสขนาดใหญ่ 4M ดูเหมือนจะปลอดภัยกว่า
มีวิธีหนึ่งที่ฉันรู้ ตั้งค่าตัวแปรสภาพแวดล้อม JAVA_OPTS
JAVA_OPTS='-Xmx512m'
ฉันไม่พบวิธีทำสิ่งนี้เป็นพารามิเตอร์คำสั่ง
ใช้ JAVA_OPTS สำหรับการตั้งค่าด้วยตัวแปรสภาพแวดล้อม
ใช้อ็อพชัน -JX เพื่อ sbt สำหรับแต่ละอ็อพชันเช่น -J-Xmx2048 -J-XX: MaxPermSize = 512
sbt เวอร์ชันใหม่กว่ามีตัวเลือก "-mem"
javaOptions += "-XX:MaxPermSize=1024"
ใน build.sbt ของเราเป็นอ้างอิงโดย @iwein ข้างต้นไม่ได้สำหรับเราเมื่อเราได้เห็น java.lang.OutOfMemoryError โยนขณะที่กำลังวิ่งทดสอบ Specs2 ผ่าน SBT
ตัวแปรสภาพแวดล้อมคือ _JAVA_OPTIONS ซึ่งจำเป็นต้องตั้งค่า เมื่อคุณตั้งค่า _JAVA_OPTIONS และเมื่อคุณ sbt sbt จะแสดงข้อความโดยใช้ JAVA_OPTIONS และค่า
หรือคุณสามารถตั้งค่า javaOption ในไฟล์ sbt หรือ. scala เช่น
javaOptions += "-Xmx1G"
จาก sbt shell คุณสามารถเรียกใช้ show javaOptions เพื่อดูค่าที่ตั้งไว้
javaOptions in Test += "-Xmx1G"
สิ่งนี้ตั้งค่าตัวเลือก JVM สำหรับการทดสอบ ใช้งานได้กับ jvm forking ( fork in Test := true
)
build.sbt
ที่ไหน?
javaOptions in ThisBuild += "-Xmx1G"
หรือjavaOptions in (ThisBuild, Test) += "-Xmx1G"
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
javaOptions += "-Xmx1G"