Làm thế nào để đặt kích thước đống cho sbt?


90

Tôi đang sử dụng SBT 0.12.0. Tôi đã đọc các câu trả lời khác về tràn ngăn xếp và làm theo chúng, tuy nhiên không có câu trả lời nào trong số đó hữu ích, ví dụ:

  • tạo ForkRunlớp - Tôi đã không quan sát thấy bất kỳ quá trình phân tách nào trong quá trình sử dụng sbt
  • thiết lập biến môi trường JAVA_OPTS- nó được thiết lập nhưng dòng lệnh tiến trình của sbt dường như không sử dụng nó.
  • sbt -J-Xmx2Gnối tham số vào dòng lệnh quy trình sbt, tuy nhiên giá trị cũ -Xmx1536mđược sbt sử dụng thay vì tham số được nối thêm.

Tui bỏ lỡ điều gì vậy? Làm cách nào để đặt kích thước heap cho sbt 0,12, khi thực hiện cả thử nghiệm và run?


9
Bạn đã thử memtham số khi bắt đầu sbt chưa? (ví dụ sbt -mem2000)
om-nom-nom

2
Bạn có thể có lỗi đánh máy, nó phải là JAVA_OPTS chứ không phải JAVA_OPS
Noah

Kiểm tra câu trả lời của tôi cho một bản sao của câu hỏi này. stackoverflow.com/questions/3868863/... câu trả lời được đánh dấu có sai, nhưng tôi làm việc (đôi khi bạn cần phải kiểm tra ý kiến / phiếu quá :)
iwein

Câu trả lời:


101

Bạn cần SBT_OPTS, đây là những gì tôi sử dụng trong .bash_profile của mình :

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

CẬP NHẬT: Để có được không gian heap 2G, bạn có thể sử dụng cái này:

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

LƯU Ý: SBT PHẢI LÀ PHIÊN BẢN MỚI NHẤT

Các phiên bản cũ hơn sbtchứa các lỗi ghi đè các cài đặt này, sử dụng brew upgrade sbtcho phiên bản mới nhất sbtdành cho Mac (giả sử cài đặt brew) (IDK cho Linux). https://github.com/sbt/sbt/issues/2945#issuecomment-277490848


1
Cảm ơn bạn. Nó thực sự thay đổi dòng lệnh của quy trình sbt như mong đợi, tuy nhiên dòng lệnh cũ -Xmx1546mvẫn tồn tại trong dòng lệnh và kích thước heap tối đa vẫn được giới hạn ở mức 1,5 GB, như được hiển thị trong visualvm.

1
bất kỳ cách nào để thiết lập cài đặt môi trường này trong cấu hình SBT được kiểm soát nguồn?
Kevin Meredith

Hãy nhìn vào nguồn scalaz, họ có một tập tin bash gọi là SBT đó tải tất cả những gì họ cần aka là cụ thể môi trường github.com/scalaz/scalaz/blob/series/7.2.x/sbt
Noah

4
Tôi nhận được cảnh báo:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=4G; support was removed in 8.0
samthebest

1
@samthebest Perm Gen về cơ bản đã bị loại bỏ trong Java 8, vì vậy không cần thiết phải thêm nó vào.
Noah

65

Kể từ tháng 3 năm 2015, nếu bạn đang sử dụng sbt trên OSX với Homebrew thì bạn nên chỉnh sửa tệp/usr/local/etc/sbtopts

ví dụ

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

5
Điều này dường như cũng hoạt động tốt cho các cửa sổ, thay vì phải lộn xộn với các biến env (tệp nằm trong c: \ program files \ sbt \ confs).
Luciano,

2
Trong Linux, nó có trong /etc/sbt-launcher-packaging.
Robin Green

1
Trong Ubuntu Artful, tôi tìm thấy nó trong/etc/sbt/sbtopts
Synesso

Giải pháp này sẽ làm cho JVM phân bổ trước tất cả bộ nhớ 2GB. Nếu bạn sử dụng SBT_OPTS=-Xmx2G sbtđể khởi động SBT, nó sẽ phát triển đống khi cần thiết lên đến tối đa 2GB.
mgd

Hãy xem giải pháp của @mike s ở trên: stackoverflow.com/a/55706960/1199564
mgd

42

"sbt -mem 23000 run" phù hợp với tôi.


6
đó là 23Gb phải không ..?
Ben Hutchison

1
@BenHutchison này có lẽ là wrapper SBT paulp của, không phải là SBT ban đầu là nó
matanster

19

Tôi đã tìm được giải pháp. Bất kể bạn chỉ định kích thước heap JVM như thế nào, nó sẽ không bao giờ hoạt động vì tệp thực thi SBT đã bị ghi đè.

Có một dòng trong tệp thực thi SBT cho biết:

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

Vì vậy, tôi đã chỉnh sửa tệp:

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

Xóa -dòng.

Bây giờ khi bạn chạy SBT, nó sẽ không ghi đè cài đặt kích thước heap JVM của bạn nữa. Bạn có thể chỉ định cài đặt kích thước đống bằng cách sử dụng câu trả lời của @ Noan.

Hay cách khác:

sbt -J-Xmx4G -J-Xms4G


3
Trên thực tế có vẻ như export SBT_OPTS="..."trong ~/.sbtconfiglàm việc thực sự.
Erik Kaplun

15

Trên windows, đối với sbt 0.13.9.2, bạn cần đặt JAVA_OPTScác tùy chọn jvm mà bạn muốn.

> set JAVA_OPTS=-Xmx1G
> sbt assembly

Tập sbt.batlệnh tải các giá trị mặc định của nó từ conf\sbtconfig.txtvào CFG_OPTSnhưng sẽ sử dụng JAVA_OPTSthay thế nếu được đặt.

Các đoạn trích liên quan từ 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!
)

. . . (nhảy) . . .

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

Tôi đang tìm cách giải quyết vấn đề như thế này trên Mac OS X bằng bản cài đặt SBT tại nhà. Nếu bạn đã cài đặt SBT qua homebrew, thì bạn đã rõ vì /usr/local/bin/sbttệp này trông giống như

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

Điều này có nghĩa là bất kỳ cài đặt nào bạn đưa vào SBT_OPTSđều sẽ dính (-Xmx của bạn sẽ được ưu tiên). Hơn nữa, dòng đầu tiên của tập lệnh sẽ thực hiện bất kỳ lệnh nào ~/.sbtconfignếu nó tồn tại, vì vậy có thể là nơi tốt hơn để đặt các tùy chọn SBT của bạn nếu bạn đang chơi với chúng khá nhiều. Bạn sẽ không phải thực hiện source ~/.bash_profilemỗi lần thay đổi đối vớiSBT_OPTS


2
Đúng. Đây là những gì tôi có trong $ HOME / .sbtconfig. export SBT_OPTS = "- XX: MaxPermSize = 512M -Xmx2G -Xms64M" và khi tôi khởi động sbt, tôi thực hiện một ps aux và nó hiển thị / usr / bin / java -Xmx512M -XX: MaxPermSize = 512M -Xmx2G -Xms64M -jar / usr / local / Cellar / SBT / 0.13.0 / libexec / SBT-launch.jar
Adrian Rodriguez

Tuy nhiên, tôi vừa thấy câu trả lời bên dưới và có lẽ trình khởi chạy đó dành cho một kiểu thiết lập khác. Thiết lập của tôi dành riêng cho Mac bằng cách sử dụng gói homebrew.
Adrian Rodriguez

2
Homebrew SBT hiện yêu cầu kích thước heap để được cấu hình với -memtham số trong/usr/local/etc/sbtopts
Synesso

6

Nếu chạy sbt từ PowerShell, hãy đặt SBT_OPTsbiến môi trường, như sau:

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

Sau đó chạy:

sbt

6

Đối với SBT phiên bản 1.0.4 trên Windows , cài đặt JVMsbt\conf\sbtconfig.txt mặc định đến từ tệp. Chỉ cần chỉnh sửa các giá trị ở đây. Thay đổi -Xmx512Mthành -Xmx2048M.

Đây không phải là nguồn duy nhất của các tùy chọn JVM cho SBT. Những người khác có thể được tìm thấy bằng cách kiểm tra sbt.bat. Một cách đơn giản để chẩn đoán, nơi nào các thiết lập đến từ đâu, là do ý kiến ra dòng này trong tập tin batch: @echo off.


Lưu ý: cái này sbt\confkhông được đặt trong thư mục người dùng, mà trong thư mục Program Files, chẳng hạn như C:\Program Files (x86)\sbt\conf.
Suma

5

Một cách nhanh chóng để làm điều đó là với một .jvmoptstệp trong thư mục gốc của dự án của bạn (từ tài liệu Lagom Framework ):

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

1
Đây phải được đánh dấu là câu trả lời đúng vì nó cũng cho phép cài đặt theo dự án.
mgd

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.