จะกำหนดขนาดฮีปสำหรับ sbt ได้อย่างไร?


92

ฉันใช้ SBT 0.12.0 ฉันได้อ่านคำตอบอื่น ๆ เกี่ยวกับ stack overflow แล้วและปฏิบัติตาม แต่ไม่มีคำตอบใดที่ช่วยได้เช่น:

  • สร้าง ForkRunคลาส - ฉันไม่ได้สังเกตเห็นกระบวนการแยกระหว่างการใช้งาน sbt
  • ตั้งค่าตัวแปรสภาพแวดล้อมJAVA_OPTS- ถูกตั้งค่า แต่บรรทัดคำสั่งกระบวนการของ sbt ดูเหมือนจะไม่ใช้เลย
  • sbt -J-Xmx2Gผนวกพารามิเตอร์เข้ากับบรรทัดคำสั่งกระบวนการ sbt อย่างไรก็ตามค่าเก่า-Xmx1536mถูกใช้โดย sbt แทนพารามิเตอร์ต่อท้าย

ฉันพลาดอะไรไปรึเปล่า? ฉันจะตั้งค่าขนาดฮีปสำหรับ sbt 0.12 ได้อย่างไรเมื่อทำการทดสอบทั้งสองและrun?


9
คุณได้ลองmemพารามิเตอร์เมื่อคุณเริ่ม sbt หรือไม่? (เช่นsbt -mem2000)
om-nom-nom

2
คุณอาจพิมพ์ผิดควรเป็น JAVA_OPTS ไม่ใช่ JAVA_OPS
โนอาห์

ตรวจสอบคำตอบของฉันสำหรับคำถามนี้ซ้ำ stackoverflow.com/questions/3868863/…คำตอบที่ทำเครื่องหมายว่าผิด แต่ของฉันใช้งานได้ (บางครั้งคุณต้องตรวจสอบความคิดเห็น / โหวตด้วย :)
iwein

คำตอบ:


102

คุณต้องการSBT_OPTSนี่คือสิ่งที่ฉันใช้ใน. bash_profileของฉัน:

export SBT_OPTS="-Xmx1536M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xss2M  -Duser.timezone=GMT"

อัปเดต: เพื่อให้ได้พื้นที่ฮีป 2G ของคุณคุณสามารถใช้สิ่งนี้:

export SBT_OPTS="-Xmx2G -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=2G -Xss2M  -Duser.timezone=GMT"

หมายเหตุ: SBT ต้องเป็นเวอร์ชันล่าสุด

เวอร์ชันเก่ากว่าsbtมีข้อบกพร่องที่ลบล้างการตั้งค่าเหล่านี้ใช้brew upgrade sbtเป็นเวอร์ชันล่าสุดsbtสำหรับ Mac (สมมติว่ามีการติดตั้ง brew) (IDK สำหรับ Linux) https://github.com/sbt/sbt/issues/2945#issuecomment-277490848


1
ขอขอบคุณ. แน่นอนมันเปลี่ยนบรรทัดคำสั่งกระบวนการ sbt ตามที่คาดไว้อย่างไรก็ตามสิ่งเก่า-Xmx1546mยังคงมีอยู่ในบรรทัดคำสั่งและขนาดฮีปสูงสุดยังคงถูก จำกัด ไว้ที่ 1.5 GB ดังที่แสดงใน visualvm

1
วิธีใดในการตั้งค่าสภาพแวดล้อมนี้ในการกำหนดค่า SBT ที่ควบคุมด้วยแหล่งที่มา
Kevin Meredith

ดูแหล่งที่มาของ scalaz พวกเขามีไฟล์ bash ที่เรียกว่า sbt ที่โหลดทุกสิ่งที่พวกเขาต้องการหรือที่เรียกว่าสภาพแวดล้อมเฉพาะgithub.com/scalaz/scalaz/blob/series/7.2.x/sbt
โนอาห์

4
ฉันได้รับคำเตือน:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0
samthebest

1
@samthebest Perm Gen ถูกลบโดยทั่วไปใน Java 8 ดังนั้นจึงไม่จำเป็นต้องรวมสิ่งนี้
Noah

66

ตั้งแต่เดือนมีนาคม 2015 หากคุณใช้ sbt บนOSXกับHomebrewคุณควรแก้ไขไฟล์/usr/local/etc/sbtopts

เช่น

# set memory options
#
#-mem   <integer>
-mem 2048

5
ดูเหมือนว่าจะทำงานได้ดีสำหรับ windows แทนที่จะต้องยุ่งกับตัวแปร env (ไฟล์อยู่ภายใต้ c: \ program files \ sbt \ confs)
Luciano

2
ใน Linux มันอยู่ใน/etc/sbt-launcher-packaging.
Robin Green

1
ใน Ubuntu Artful ฉันพบมันใน/etc/sbt/sbtopts
Synesso

โซลูชันนี้จะทำการจัดสรร JVM ล่วงหน้าหน่วยความจำ 2GB ทั้งหมด หากคุณใช้SBT_OPTS=-Xmx2G sbtเพื่อเริ่ม SBT มันจะเพิ่มฮีปตามความจำเป็นสูงสุด 2GB
mgd

ดูวิธีแก้ปัญหาของ @mike ด้านบน: stackoverflow.com/a/55706960/1199564
mgd

43

"sbt -mem 23000 run" ใช้ได้ผลสำหรับฉัน


6
นั่น 23Gb ไม่ใช่เหรอ .. ?
Ben Hutchison

1
@BenHutchison นี่อาจจะเป็นกระดาษห่อ sbt ของ paulp ไม่ใช่ sbt แบบเดิม
matanster

20

ฉันพบทางออกแล้ว ไม่ว่าคุณจะระบุขนาดฮีป JVM อย่างไรก็จะไม่ทำงานเนื่องจาก SBT ที่เรียกใช้งานได้ถูกแทนที่ไปแล้ว

มีบรรทัดในไฟล์ปฏิบัติการ SBT ซึ่งระบุว่า:

. /usr/share/sbt/sbt-launch-lib.bash

ฉันจึงแก้ไขไฟล์:

  # run sbt
  execRunner "$java_cmd" \
    ${SBT_OPTS:-$default_sbt_opts} \
-   $(get_mem_opts $sbt_mem) \
    ${java_opts} \
    ${java_args[@]} \
    -jar "$sbt_jar" \
    "${sbt_commands[@]}" \
    "${residual_args[@]}"

ลบไฟล์ -บรรทัด

ตอนนี้เมื่อคุณเรียกใช้ SBT มันจะไม่แทนที่การตั้งค่าขนาดฮีป JVM ของคุณอีกต่อไป คุณสามารถระบุการตั้งค่าขนาดฮีปได้โดยใช้คำตอบของ @ Noan

หรืออีกทางหนึ่ง:

sbt -J-Xmx4G -J-Xms4G


3
ดูเหมือนว่าexport SBT_OPTS="..."ในการ~/.sbtconfigทำงานอย่างแท้จริง
Erik Kaplun

15

บน windows สำหรับ sbt 0.13.9.2 คุณต้องตั้งค่าJAVA_OPTSเป็นตัวเลือก jvm ที่คุณต้องการ

> set JAVA_OPTS=-Xmx1G
> sbt assembly

sbt.batสคริปต์โหลดค่าเริ่มต้นจากการconf\sbtconfig.txtเข้ามาCFG_OPTSแต่จะใช้JAVA_OPTSแทนถ้าชุด

ข้อความที่ตัดตอนมาจากsbt.bat:

rem FIRST we load the config file of extra options.
set FN=%SBT_HOME%\..\conf\sbtconfig.txt
set CFG_OPTS=
FOR /F "tokens=* eol=# usebackq delims=" %%i IN ("%FN%") DO (
  set DO_NOT_REUSE_ME=%%i
  rem ZOMG (Part #2) WE use !! here to delay the expansion of
  rem CFG_OPTS, otherwise it remains "" for this loop.
  set CFG_OPTS=!CFG_OPTS! !DO_NOT_REUSE_ME!
)

. . . (ข้าม). . .

rem We use the value of the JAVA_OPTS environment variable if defined, rather than the config.
set _JAVA_OPTS=%JAVA_OPTS%
if "%_JAVA_OPTS%"=="" set _JAVA_OPTS=%CFG_OPTS%
:run
"%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -cp "%SBT_HOME%sbt-launch.jar" xsbt.boot.Boot %*

11

ฉันต้องการแก้ปัญหาเช่นนี้บน Mac OS X ด้วยการติดตั้ง homebrew ของ SBT หากคุณติดตั้ง SBT ผ่าน homebrew คุณจะชัดเจนเนื่องจาก/usr/local/bin/sbtไฟล์ดูเหมือน

#!/bin/sh
test -f ~/.sbtconfig && . ~/.sbtconfig
exec java -Xmx512M ${SBT_OPTS} -jar /usr/local/Cellar/sbt/0.12.3/libexec/sbt-launch.jar "$@"

ซึ่งหมายความว่าการตั้งค่าใด ๆ ที่คุณใส่ไว้SBT_OPTSจะติด (-Xmx ของคุณจะมีความสำคัญกว่า) นอกจากนี้บรรทัดแรกของสคริปต์จะดำเนินการคำสั่งใด ๆ~/.sbtconfigหากมีอยู่ดังนั้นจึงอาจเป็นที่ที่ดีกว่าในการใส่ตัวเลือก SBT ของคุณหากคุณกำลังเล่นกับพวกเขาไม่น้อย คุณจะไม่ต้องทำsource ~/.bash_profileทุกครั้งที่คุณทำการเปลี่ยนแปลงSBT_OPTS


2
ใช่. นี่คือสิ่งที่ฉันมีใน $ HOME / .sbtconfig ส่งออก SBT_OPTS = "- XX: MaxPermSize = 512M -Xmx2G -Xms64M" และเมื่อฉันเริ่ม sbt ฉันจะทำ ps aux และจะแสดง / usr / bin / java -Xmx512M -XX: MaxPermSize = 512M -Xmx2G -Xms64M -jar / usr / local / Cellar / sbt / 0.13.0 / libexec / sbt-launch.jar
Adrian Rodriguez

อย่างไรก็ตามฉันเพิ่งเห็นคำตอบด้านล่างและบางทีตัวเรียกใช้งานนั้นใช้สำหรับการตั้งค่าประเภทอื่น การตั้งค่าของฉันเฉพาะสำหรับ Mac โดยใช้แพ็คเกจ homebrew
Adrian Rodriguez

2
Homebrew SBT ต้องการขนาดฮีปเพื่อกำหนดค่าด้วย-memพารามิเตอร์ใน/usr/local/etc/sbtopts
Synesso

6

หากเรียกใช้ sbt จาก PowerShell ให้ตั้งค่าSBT_OPTsตัวแปรสภาพแวดล้อมดังนี้:

$env:SBT_OPTS="-Xms512M -Xmx1024M -Xss2M -XX:MaxMetaspaceSize=1024M"

จากนั้นเรียกใช้:

sbt

6

สำหรับ SBT เวอร์ชัน 1.0.4 บน Windowsการตั้งค่า JVMsbt\conf\sbtconfig.txtเริ่มต้นมาจากไฟล์ เพียงแก้ไขค่าที่นี่ เปลี่ยน-Xmx512Mเป็น-Xmx2048M .

นี่ไม่ใช่แหล่งเดียวของตัวเลือก JVM สำหรับ SBT อื่น ๆ sbt.batสามารถพบได้โดยการตรวจสอบ @echo offวิธีง่ายๆในการวินิจฉัยที่ทำการตั้งค่ามาจากเกิดจากการแสดงความคิดเห็นออกบรรทัดนี้ในแฟ้มชุด:


หมายเหตุ: สิ่งนี้sbt\confไม่ได้อยู่ในไดเร็กทอรีผู้ใช้ แต่อยู่ในโฟลเดอร์ Program Files เช่นC:\Program Files (x86)\sbt\conf.
สุมา

6

วิธีที่รวดเร็วในการดำเนินการคือการใช้.jvmoptsไฟล์ในรูทของโปรเจ็กต์ของคุณ (จากเอกสาร Lagom Framework ):

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

1
สิ่งนี้ควรถูกทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องเนื่องจากอนุญาตตามการตั้งค่าโครงการด้วย
mgd

0

ในกรณีของฉันการกำหนดค่าบริการของฉันเขียนทับตัวแปรสภาพแวดล้อมSBT_OPTSและJAVA_OPTS. ฉันสามารถกำหนดขีด จำกัด ได้โดยตั้งค่าbuild.sbtดังต่อไปนี้:

javaOptions in Universal ++= Seq(
  "-J-Xms1g",
  "-J-Xmx2g")

อ้างอิง: https://www.scala-sbt.org/sbt-native-packager/archetypes/java_app/customize.html

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