Làm cách nào để chỉ định kích thước đống tối đa JVM “-Xmx” để chạy ứng dụng có hành động “chạy” trong SBT?


97

Ứng dụng của tôi xử lý mảng dữ liệu lớn và cần nhiều bộ nhớ hơn JVM cung cấp theo mặc định. Tôi biết trong Java, nó được chỉ định bởi tùy chọn "-Xmx". Làm cách nào để thiết lập SBT sử dụng giá trị "-Xmx" cụ thể để chạy ứng dụng có hành động "run"?

Câu trả lời:


17

Thử cái này:

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
Điều này đã lỗi thời, bây giờ bạn có thể sử dụngjavaOptions += "-Xmx1G"
iwein

1
@iwein nội dung bài đăng của tôi dường như rất quan trọng đối với bạn.
Arne

2
Lưu ý rằng javaOptionschỉ có hiệu lực đối với các JVM đã phân nhánh (xem scala-sbt.org/0.13/docs/Forking.html )
Yar

1
Thêm fork in run := ture cho phépjavaOptions
coanor

@coanor câu trả lời này dành cho phiên bản cổ của sbt. Có một câu trả lời với thứ hạng cao hơn nhiều ngay dưới cái này. Câu trả lời này là câu trả lời chính xác tại thời điểm câu hỏi được đặt ra.
Arne

113

Đối với các quy trình được phân nhánh, bạn nên xem Build.scala

Để sửa đổi các tùy chọn java cho các quy trình đã phân nhánh, bạn cần chỉ định chúng trong Build.scala (hoặc bất kỳ thứ gì bạn đã đặt tên cho bản dựng của mình) như sau:

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

Điều này sẽ cung cấp cho bạn các tùy chọn thích hợp mà không cần sửa đổi JAVA_OPTS trên toàn cầu nó sẽ đặt JAVA_OPTS tùy chỉnh trong một tập lệnh bắt đầu được tạo sbt

Đối với các quy trình không phân nhánh , thuận tiện nhất là đặt cấu hình thông qua sbtoptshoặc sbtconfigtùy thuộc vào phiên bản sbt của bạn.

Vì sbt 0.13.6 .sbtconfigkhông được dùng nữa . Sửa đổi /usr/local/etc/sbtoptstheo các dòng sau:

-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

Bạn cũng có thể tạo một .sbtoptstệp trong thư mục gốc của dự án SBT của mình bằng cách sử dụng cú pháp tương tự như trong /usr/local/etc/sbtoptstệp. Điều này làm cho dự án trở nên khép kín.

Trước sbt 0.13.6, bạn có thể đặt các tùy chọn trong .sbtconfig cho các quy trình không phân nhánh :

  1. Kiểm tra sbt ở đâu:

    $ which sbt
    /usr/local/bin/sbt
  2. Xem nội dung:

    $ 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. Đặt các tùy chọn jvm chính xác để ngăn OOM (cả thông thường và PermGen):

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

Nếu bạn chỉ muốn đặt SBT_OPTS cho loạt sbt hiện tại, bạn có thể sử dụng env SBT_OPTS=".." sbttheo đề xuất của Googol Shan. Hoặc bạn có thể sử dụng tùy chọn được thêm trong Sbt 12 : sbt -mem 2048. Điều này khó sử dụng đối với danh sách các tùy chọn dài hơn, nhưng nó có thể hữu ích nếu bạn có các dự án khác nhau với các nhu cầu khác nhau.

Lưu ý rằng CMSClassUnloadingEnabled kết hợp với UseConcMarkSweepGC giúp giữ sạch không gian PermGen, nhưng tùy thuộc vào khung công tác bạn sử dụng, bạn có thể bị rò rỉ thực tế trên PermGen, điều này cuối cùng buộc khởi động lại.


@iwein - javaOptions không thay đổi heapspace mặc định cho sbt. Tôi đã đăng ký jconsole và nó chỉ hiển thị -Xmx512M. Ngay cả khi tôi thêm SBT_OPTS trong ~ / .sbtconfig, tôi vẫn nhận được điều này trong jconsole: -Xmx512M -Xms256M -Xmx1G -XX: MaxPermSize = 256M -XX: + UseConcMarkSweepGC. Bạn có thấy Xmx512 ở phía trước không? Có một số cách không chọn javaOptions từ Build.scala. Bất kỳ gợi ý?
Anand

@Và có lẽ mọi thứ đang hoạt động hơi khác trong 0,13? Tôi sẽ cập nhật câu trả lời nếu tôi gặp bất cứ điều gì (có thể mất một lúc), hãy cho tôi biết nếu bạn tìm ra nó trong thời gian cần thiết.
iwein

@iwein Tôi vừa sử dụng phần sau trong Build.scala của mình và nó đã hoạt động. fork in run: = true, javaOptions in run ++ = Seq ("- Xms256m", "-Xmx2048m", "-XX: + UseConcMarkSweepGC"). Xem bài đăng này để biết câu trả lời stackoverflow.com/questions/27372468/… . Cảm ơn!
Anand

2
FYI bạn cũng có thể tạo một .sbtoptstệp trong thư mục gốc của dự án SBT của bạn bằng cách sử dụng cú pháp tương tự như trong /usr/local/etc/sbtoptstệp. Điều này làm cho dự án của bạn trở nên khép kín, có thể rất hữu ích trong các tình huống CI.
Age Mooij

Trên Windows sử dụng 0.13.9 (có thể là 0.13.6), tệp là C: \ Program Files (x86) \ sbt \ conf \ sbtconfig.txt. Theo mặc định, tệp có "-Xmx512M" trong đó mà không có -J được hiển thị trong câu trả lời này. Tôi có thể xác nhận rằng tệp này đang được đọc bởi thực tế là assembly sbt đưa ra cảnh báo liên quan đến -XX: MaxPermSize và khi tôi thay đổi giá trị đó, cảnh báo hiển thị giá trị tôi đã nhập chứ không phải giá trị "256m" mà nó hiển thị ban đầu.
Night Owl,

68

Trong phiên bản sbt 12 trở đi, có một tùy chọn cho điều này:

$sbt -mem 2048 

5
trên win 8.1, lệnh này không hoạt động với tôi:Not a valid command: mem (similar: set)
Kevin Meredith

43

Nếu bạn chạy sbt trên linux shell, bạn có thể sử dụng:

env JAVA_OPTS="-Xmx512m" sbt run

Đây là lệnh thường được sử dụng để chạy dự án sbt của tôi.


1
Cảm ơn rât nhiều. Một lệnh thú vị cần biết. Tôi chưa bao giờ biết về "env" đó và đã bỏ lỡ một công cụ như vậy nhiều lần.
Ivan

4
Hmm, điều này không hiệu quả với tôi! Tôi cần override def forkgiải pháp ở trên. (sbt 0.7.7)
Scott Morrison

2
có thể tệp sbt của bạn chỉ định JAVA_OPTS của riêng nó, trong trường hợp đó, các tệp này sẽ bị ghi đè. Sau đó, bạn có thể chỉ cần sửa đổi trực tiếp tệp sbt của mình, hoặc để xóa cờ -Xmx hoặc chuyển nó sang kích thước đống tối đa mong muốn của bạn.
nnythm

23

.sbtconfigbắt đầu bằng SBT không được dùng nữa 0.13.6. Thay vào đó, tôi đã định cấu hình các tùy chọn này /usr/local/etc/sbtoptstheo cách sau:

-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-Xss1Mlà một chút thấp đối với các lớp trường hợp lớn, 4M dường như an toàn hơn.
Marius Soutier

7

Có một cách tôi biết. Đặt biến môi trường JAVA_OPTS.

JAVA_OPTS='-Xmx512m'

Tôi không tìm thấy cách nào để thực hiện việc này dưới dạng tham số lệnh.


7

Sử dụng JAVA_OPTS để cài đặt với biến môi trường.

Sử dụng các tùy chọn -JX để sbt cho các tùy chọn riêng lẻ, ví dụ -J-Xmx2048 -J-XX: MaxPermSize = 512

Các phiên bản mới hơn của sbt có tùy chọn "-mem".


5

Trong javaOptions += "-XX:MaxPermSize=1024"build.sbt của chúng tôi như được tham chiếu bởi @iwein ở trên đã hoạt động với chúng tôi khi chúng tôi thấy lỗi java.lang.OutOfMemoryError được tạo ra trong khi chạy kiểm tra Specs2 thông qua sbt.


1
@UwePlonus nó trả lời câu hỏi.
VasiliNovikov

3

Biến môi trường là _JAVA_OPTIONS, cần được đặt. Sau khi bạn đặt _JAVA_OPTIONS và khi bạn sbt, sbt sẽ hiển thị thông báo sử dụng JAVA_OPTIONS và các giá trị.

Ngoài ra, bạn có thể đặt javaOption trong tệp sbt hoặc .scala, ví dụ:

javaOptions += "-Xmx1G"

Từ trình bao sbt, bạn có thể chạy chương trình javaOptions để xem các giá trị được đặt.


1
    javaOptions in Test += "-Xmx1G"

Điều này đặt các tùy chọn JVM cho các bài kiểm tra. Cũng hoạt động với jvm forking ( fork in Test := true).


1
bộ này ở đâu trong build.sbt?
javadba

Bất cứ nơi nào, nếu bạn có một dự án 1 mô-đun. Thứ tự của các định nghĩa thường không quan trọng trong SBT. Nếu bạn có nhiều mô-đun, chỉ định này hoặc một số trong số họ hoặc, nếu bạn muốn, thông qua trên toàn cầu javaOptions in ThisBuild += "-Xmx1G"hayjavaOptions in (ThisBuild, Test) += "-Xmx1G"
VasiliNovikov

1

sbt cho phép bạn liệt kê các tùy chọn JVM bạn cần để chạy dự án của mình trên một tệp có tên

.jvmopts

trong thư mục gốc của dự án của bạn. sau đó thêm các tùy chọn java mà bạn muốn

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

nó được thử nghiệm và hoạt động trong windows 10 https://www.lagomframework.com/documentation/1.4.x/scala/JVMMemoryOnDev.html

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.