Bagaimana cara mengatur ukuran tumpukan untuk sbt?


90

Saya menggunakan SBT 0.12.0. Saya telah membaca jawaban lain tentang stack overflow dan mengikutinya, namun tidak ada yang membantu, misalnya:

  • create ForkRunclass - Saya belum mengamati proses bercabang selama penggunaan sbt
  • set variabel lingkungan JAVA_OPTS- sudah disetel tetapi baris perintah proses sbt tampaknya tidak menggunakannya sama sekali.
  • sbt -J-Xmx2Gmenambahkan parameter ke baris perintah proses sbt, namun nilai lama -Xmx1536mdigunakan oleh sbt sebagai ganti parameter yang ditambahkan.

Apakah saya melewatkan sesuatu? Bagaimana cara menyetel ukuran heap untuk sbt 0,12, saat melakukan pengujian dan run?


9
Sudahkah Anda mencoba memparameter saat memulai sbt? (misalnya sbt -mem2000)
om-nom-nom

2
Anda mungkin salah ketik, seharusnya JAVA_OPTS bukan JAVA_OPS
Noah

Lihat jawaban saya untuk duplikat pertanyaan ini. stackoverflow.com/questions/3868863/… jawaban yang ditandai ada yang salah, tetapi milik saya berfungsi (terkadang Anda perlu memeriksa komentar / suara juga :)
iwein

Jawaban:


101

Anda perlu SBT_OPTS, inilah yang saya gunakan di .bash_profile saya :

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

PEMBARUAN: Untuk mendapatkan ruang heap 2G, Anda dapat menggunakan ini:

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

CATATAN: SBT HARUS VERSI TERBARU

Versi lama sbtberisi bug yang menggantikan pengaturan ini, gunakan untuk Mac brew upgrade sbtterbaru sbt(dengan asumsi brew install) (IDK untuk Linux). https://github.com/sbt/sbt/issues/2945#issuecomment-277490848


1
Terima kasih. Itu memang mengubah baris perintah proses sbt seperti yang diharapkan, namun yang lama -Xmx1546mmasih ada di baris perintah dan ukuran tumpukan maksimum masih dibatasi pada 1,5 GB, seperti yang ditunjukkan di visualvm.

1
cara apa pun untuk menyetel pengaturan lingkungan ini dalam konfigurasi SBT yang dikontrol oleh sumber?
Kevin Meredith

Lihatlah sumber scalaz, mereka memiliki file bash bernama sbt yang memuat semua yang mereka butuhkan alias khusus lingkungan github.com/scalaz/scalaz/blob/series/7.2.x/sbt
Noah

4
Saya mendapat peringatan:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0
samthebest

1
@samthebest Perm Gen pada dasarnya dihapus di Java 8 jadi tidak perlu menyertakan ini.
Noah

66

Mulai Maret 2015, jika Anda menggunakan sbt di OSX dengan Homebrew, maka Anda harus mengedit file tersebut/usr/local/etc/sbtopts

misalnya

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

5
Ini tampaknya juga berfungsi dengan baik untuk windows, daripada harus dipusingkan dengan variabel env (file di bawah c: \ program files \ sbt \ confs).
Luciano

2
Di Linux ada /etc/sbt-launcher-packaging.
Robin Green

1
Di Ubuntu Artful, saya menemukannya di/etc/sbt/sbtopts
Synesso

Solusi ini akan membuat JVM mengalokasikan semua memori 2GB. Jika Anda menggunakan SBT_OPTS=-Xmx2G sbtuntuk memulai SBT, itu akan menambah tumpukan sesuai kebutuhan hingga maksimum 2GB.
mgd

Lihat solusi @mike di atas: stackoverflow.com/a/55706960/1199564
mgd


19

Saya sudah menemukan solusinya. Tidak peduli bagaimana Anda menentukan ukuran heap JVM, itu tidak akan pernah berfungsi karena SBT yang dapat dieksekusi sudah menimpanya.

Ada baris dalam SBT yang dapat dieksekusi yang mengatakan:

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

Jadi saya mengedit file:

  # 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[@]}"

Hapus -garis.

Sekarang ketika Anda menjalankan SBT, itu tidak akan lagi menggantikan pengaturan ukuran heap JVM Anda. Anda dapat menentukan pengaturan ukuran heap menggunakan jawaban @ Noan.

Atau sebagai alternatif:

sbt -J-Xmx4G -J-Xms4G


3
Sebenarnya tampaknya bahwa export SBT_OPTS="..."dalam ~/.sbtconfigmelakukan kerja memang.
Erik Kaplun

15

Di windows, untuk sbt 0.13.9.2, Anda perlu mengatur JAVA_OPTSke opsi jvm yang Anda inginkan.

> set JAVA_OPTS=-Xmx1G
> sbt assembly

The sbt.batScript beban default-nya dari conf\sbtconfig.txtdalam CFG_OPTStetapi akan menggunakan JAVA_OPTSbukan jika set.

Kutipan yang relevan dari 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!
)

. . . (lewati). . .

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

Saya ingin menyelesaikan masalah seperti ini di Mac OS X dengan menginstal SBT homebrew. Jika Anda menginstal SBT melalui homebrew, Anda di bersihkan karena /usr/local/bin/sbtfile tersebut terlihat seperti

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

Ini berarti bahwa pengaturan apa pun yang Anda masukkan SBT_OPTSakan tetap (-Xmx Anda akan diutamakan). Selain itu, baris pertama skrip akan menjalankan perintah apa pun ~/.sbtconfigjika ada, jadi ini mungkin tempat yang lebih baik untuk meletakkan opsi SBT Anda jika Anda cukup sering memainkannya. Anda tidak perlu melakukannya source ~/.bash_profilesetiap kali Anda membuat perubahan padaSBT_OPTS


2
Iya. Inilah yang saya miliki di $ HOME / .sbtconfig. ekspor SBT_OPTS = "- XX: MaxPermSize = 512M -Xmx2G -Xms64M" dan ketika saya memulai sbt, saya melakukan ps aux dan itu menampilkan / usr / bin / java -Xmx512M -XX: MaxPermSize = 512M -Xmx2G -Xms64M -jar / usr / local / Cellar / sbt / 0.13.0 / libexec / sbt-launch.jar
Adrian Rodriguez

Namun, saya baru saja melihat jawabannya di bawah dan mungkin peluncur itu untuk jenis penyiapan lain. Pengaturan saya khusus untuk Mac yang menggunakan paket homebrew.
Adrian Rodriguez

2
Homebrew SBT sekarang memerlukan ukuran heap untuk dikonfigurasi dengan -memparameter di/usr/local/etc/sbtopts
Synesso

6

Jika menjalankan sbt dari PowerShell, setel SBT_OPTsvariabel lingkungan, seperti ini:

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

Lalu lari:

sbt

6

Untuk SBT versi 1.0.4 di Windows , pengaturan JVMsbt\conf\sbtconfig.txt default berasal dari file. Cukup edit nilainya di sini. Ganti -Xmx512Mke -Xmx2048M.

Ini bukan satu-satunya sumber opsi JVM untuk SBT. Lainnya dapat ditemukan dengan memeriksa sbt.bat. Sebuah cara sederhana untuk mendiagnosa, di mana pengaturan berasal, adalah dengan komentar dari baris ini di file batch: @echo off.


Catatan: ini sbt\confditempatkan bukan di direktori pengguna, tetapi di folder Program Files, seperti C:\Program Files (x86)\sbt\conf.
Suma

5

Cara cepat untuk melakukannya adalah dengan .jvmoptsfile di root proyek Anda (dari dokumentasi Lagom Framework ):

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

1
Ini harus ditandai sebagai jawaban yang benar karena juga memungkinkan per pengaturan proyek.
mgd

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.