Bagaimana menentukan ukuran heap maksimum JVM "-Xmx" untuk menjalankan aplikasi dengan tindakan "run" di SBT?

97

Aplikasi saya melakukan pemrosesan array data yang besar dan membutuhkan lebih banyak memori daripada yang diberikan JVM secara default. Saya tahu di Java itu ditentukan oleh opsi "-Xmx". Bagaimana cara mengatur SBT agar menggunakan nilai "-Xmx" tertentu untuk menjalankan aplikasi dengan tindakan "run"?

Ivan
sumber

Jawaban:

17

Coba ini:

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)
    })
}
Arne
sumber
53
Ini sudah usang, sekarang Anda dapat menggunakanjavaOptions += "-Xmx1G"
iwein
1
@iwein konten posting saya sepertinya sangat penting bagi Anda.
Arne
2
Perhatikan bahwa javaOptionshanya berpengaruh untuk JVM bercabang (lihat scala-sbt.org/0.13/docs/Forking.html )
Yar,
1
Tambahkan fork in run := ture mengaktifkanjavaOptions
coanor
@coanor jawaban ini untuk versi kuno sbt. Ada jawaban dengan peringkat yang jauh lebih tinggi tepat di bawah ini. Jawaban ini adalah jawaban yang benar pada saat pertanyaan diajukan.
Arne
113

Untuk proses bercabang, Anda harus melihat Build.scala

Untuk mengubah opsi java untuk proses bercabang, Anda perlu menentukannya di Build.scala (atau apa pun yang Anda beri nama build Anda) seperti ini:

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

Ini akan memberi Anda opsi yang tepat tanpa memodifikasi JAVA_OPTS secara global, dan itu akan menempatkan JAVA_OPTS khusus dalam skrip awal yang dihasilkan sbt

Untuk proses yang tidak bercabang , paling mudah untuk mengatur konfigurasi melalui sbtoptsatau sbtconfigbergantung pada versi sbt Anda.

Karena sbt 0.13.6 .sbtconfigtidak digunakan lagi . Ubah di /usr/local/etc/sbtoptssepanjang baris ini:

-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

Anda juga dapat membuat .sbtoptsfile di root proyek SBT Anda menggunakan sintaks yang sama seperti di /usr/local/etc/sbtoptsfile. Ini membuat proyek mandiri.

Sebelum sbt 0.13.6 Anda dapat mengatur opsi di .sbtconfig untuk proses non-fork :

  1. Periksa di mana sbt berada:

    $ which sbt
    /usr/local/bin/sbt
    
  2. Lihat isinya:

    $ 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. Setel opsi jvm yang benar untuk mencegah OOM (reguler dan PermGen):

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

Jika Anda ingin menyetel SBT_OPTS hanya untuk menjalankan sbt saat ini, Anda dapat menggunakan env SBT_OPTS=".." sbtseperti yang disarankan oleh Googol Shan. Atau Anda dapat menggunakan opsi ditambahkan dalam Sbt 12: sbt -mem 2048. Ini menjadi sulit untuk daftar opsi yang lebih panjang, tetapi mungkin membantu jika Anda memiliki proyek berbeda dengan kebutuhan berbeda.

Perhatikan bahwa CMSClassUnloadingEnabled bersama UseConcMarkSweepGC membantu menjaga ruang PermGen tetap bersih, tetapi bergantung pada kerangka kerja apa yang Anda gunakan, Anda mungkin mengalami kebocoran aktual di PermGen, yang pada akhirnya memaksa restart.

iwein
sumber
@iwein - javaOptions tidak mengubah heapspace default untuk sbt. Saya memeriksa di jconsole dan itu hanya menunjukkan -Xmx512M. Bahkan jika saya menambahkan SBT_OPTS di ~ / .sbtconfig, saya masih mendapatkan ini di jconsole: -Xmx512M -Xms256M -Xmx1G -XX: MaxPermSize = 256M -XX: + UseConcMarkSweepGC. Apakah Anda melihat Xmx512 di depan? Beberapa cara tidak memilih javaOptions dari Build.scala. Ada petunjuk?
Anand
@Anand mungkin hal-hal bekerja sedikit berbeda di 0,13? Saya akan memperbarui jawabannya jika saya menemukan sesuatu (mungkin perlu beberapa saat), beri tahu saya jika Anda mengetahuinya untuk sementara waktu.
iwein
@iwein Saya baru saja menggunakan yang berikut ini di Build.scala saya dan berhasil. garpu di jalankan: = true, javaOptions di run ++ = Seq ("- Xms256m", "-Xmx2048m", "-XX: + UseConcMarkSweepGC"). Lihat posting ini untuk jawaban stackoverflow.com/questions/27372468/… . Terima kasih!
Anand
2
FYI Anda juga dapat membuat .sbtoptsfile di root proyek SBT Anda menggunakan sintaks yang sama seperti di /usr/local/etc/sbtoptsfile. Ini membuat proyek Anda mandiri, yang bisa sangat berguna dalam situasi CI.
Usia Mooij
Pada Windows yang menggunakan 0.13.9 (mungkin 0.13.6), file tersebut adalah C: \ Program Files (x86) \ sbt \ conf \ sbtconfig.txt. Secara default, file tersebut memiliki "-Xmx512M" di dalamnya tanpa -J yang ditampilkan dalam jawaban ini. Saya dapat mengkonfirmasi bahwa file ini sedang dibaca oleh fakta bahwa sbt assembly mengeluarkan peringatan mengenai -XX: MaxPermSize dan ketika saya mengubah nilai itu peringatan menunjukkan nilai yang saya masukkan dan bukan nilai "256m" yang awalnya ditampilkan.
Night Owl
68

Di sbt versi 12 dan seterusnya ada opsi untuk ini:

$sbt -mem 2048 
Prashant Sharma
sumber
5
pada win 8.1, perintah ini tidak berfungsi untuk saya:Not a valid command: mem (similar: set)
Kevin Meredith
43

Jika Anda menjalankan sbt di linux shell, Anda dapat menggunakan:

env JAVA_OPTS="-Xmx512m" sbt run

Ini adalah perintah yang biasanya saya gunakan untuk menjalankan proyek sbt saya.

Googol Shan
sumber
1
Terima kasih banyak. Perintah keren untuk diketahui. Saya tidak pernah tahu tentang "env" itu dan melewatkan alat seperti itu berkali-kali.
Ivan
4
Hmm, ini tidak berhasil untuk saya! Saya membutuhkan override def forksolusi di atas. (sbt 0.7.7)
Scott Morrison
2
ada kemungkinan file sbt Anda menentukan JAVA_OPTS-nya sendiri, dalam hal ini ini akan ditimpa. Anda kemudian dapat langsung memodifikasi file sbt Anda, baik untuk menghapus tanda -Xmx atau mengubahnya ke ukuran heap maksimum yang Anda inginkan.
nnythm
23

.sbtconfigtidak digunakan lagi dimulai dengan SBT 0.13.6. Sebagai gantinya, saya mengonfigurasi opsi ini /usr/local/etc/sbtoptsdengan cara berikut:

-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
omnomnom
sumber
1
-J-Xss1Magak rendah untuk kelas kasus besar, 4M tampaknya lebih aman.
Marius Soutier
7

Ada satu cara yang saya tahu. Setel variabel lingkungan JAVA_OPTS.

JAVA_OPTS='-Xmx512m'

Saya belum menemukan cara untuk melakukan ini sebagai parameter perintah.

Synesso
sumber
7

Gunakan JAVA_OPTS untuk pengaturan dengan variabel lingkungan.

Gunakan opsi -JX ke sbt untuk opsi individual, misalnya -J-Xmx2048 -J-XX: MaxPermSize = 512

Versi sbt yang lebih baru memiliki opsi "-mem".

Brett
sumber
5

Dalam javaOptions += "-XX:MaxPermSize=1024"build.sbt kami seperti yang direferensikan oleh @iwein di atas berfungsi untuk kami saat kami melihat java.lang.OutOfMemoryError muncul saat menjalankan pengujian Specs2 melalui sbt.

Pete Neisen
sumber
1
@UwePlonus itu menjawab pertanyaan itu.
VasiliNovikov
3

Variabel lingkungan adalah _JAVA_OPTIONS, yang perlu disetel. Setelah Anda menyetel _JAVA_OPTIONS, dan saat Anda sbt, sbt akan menampilkan pesan menggunakan JAVA_OPTIONS dan nilainya.

Alternatifnya, Anda dapat mengatur javaOption di file sbt atau .scala misalnya

javaOptions += "-Xmx1G"

Dari shell sbt Anda dapat menjalankan show javaOptions untuk melihat nilai-nilai yang ditetapkan.

Sajive Kumar
sumber
1
    javaOptions in Test += "-Xmx1G"

Ini menetapkan opsi JVM untuk pengujian. Bekerja juga dengan forking jvm ( fork in Test := true).

VasiliNovikov
sumber
1
di mana set ini di build.sbt?
javadba
Di mana saja, jika Anda memiliki proyek 1 modul. Urutan definisi umumnya tidak menjadi masalah dalam SBT. Jika Anda memiliki beberapa modul, tentukan ini pada beberapa di antaranya atau, jika Anda mau, secara global melalui javaOptions in ThisBuild += "-Xmx1G"ataujavaOptions in (ThisBuild, Test) += "-Xmx1G"
VasiliNovikov