SBT'de "çalıştır" eylemi olan bir uygulamayı çalıştırmak için JVM maksimum yığın boyutu "-Xmx" nasıl belirlenir?


98

Uygulamam büyük veri dizileri işliyor ve JVM'nin varsayılan olarak verdiğinden daha fazla belleğe ihtiyaç duyuyor. Java'da "-Xmx" seçeneğiyle belirtildiğini biliyorum. SBT'yi, bir uygulamayı "çalıştır" eylemiyle çalıştırmak için belirli "-Xmx" değerini kullanacak şekilde nasıl ayarlayabilirim?

Yanıtlar:


17

Bunu dene:

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
Bu modası geçmiş, şimdi kullanabilirsinizjavaOptions += "-Xmx1G"
iwein

1
@iwein gönderimin içeriği sizin için çok önemli görünüyor.
Arne

2
javaOptionsYalnızca çatallı JVM'ler için etkiye sahip olduğuna dikkat edin (bkz. Scala-sbt.org/0.13/docs/Forking.html )
Yar

1
Ekle fork in run := ture etkinleştirirjavaOptions
coanor

@coanor bu cevap sbt'nin eski bir versiyonu içindir. Bunun hemen altında çok daha yüksek sıralamalı bir cevap var. Bu cevap, soru sorulduğunda doğru cevaptı.
Arne

115

Çatallı işlemler için Build.scala'ya bakmalısınız.

Çatallanmış süreçler için java seçeneklerini değiştirmek için, bunları Build.scala'da (veya yapınızı ne adlandırdıysanız) şu şekilde belirtmeniz gerekir:

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

Bu size JAVA_OPTS'yi global olarak değiştirmeden uygun seçenekleri sunacak ve özel JAVA_OPTS'yi sbt oluşturulmuş bir başlangıç ​​betiğine koyacaktır.

For olmayan çatal süreçler bunun aracılığıyla yapılandırma ayarlamak, en uygun seçenek sbtoptsya sbtconfigda sbt sürümüne bağlı.

Sbt 0.13.6 .sbtconfigkullanımdan kaldırıldığından beri . Şu /usr/local/etc/sbtoptssatırlar boyunca değiştirin :

-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

.sbtoptsSBT projenizin kök dizininde, dosyadakiyle aynı sözdizimini kullanarak bir dosya da oluşturabilirsiniz /usr/local/etc/sbtopts. Bu, projeyi kendi kendine yeten yapar.

Sbt 0.13.6'dan önce çatallı olmayan işlemler için .sbtconfig içindeki seçenekleri ayarlayabilirsiniz :

  1. Sbt'nin nerede olduğunu kontrol edin:

    $ which sbt
    /usr/local/bin/sbt
    
  2. İçindekilere bakın:

    $ 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. OOM'yi önlemek için doğru jvm seçeneklerini ayarlayın (hem normal hem de PermGen):

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

SBT_OPTS'yi yalnızca sbt'nin mevcut çalışması için ayarlamak istiyorsanız, env SBT_OPTS=".." sbtGoogol Shan tarafından önerildiği gibi kullanabilirsiniz . Veya Sbt 12: 'de eklenen seçeneği kullanabilirsiniz sbt -mem 2048. Bu, daha uzun seçenek listeleri için zorlaşır, ancak farklı ihtiyaçları olan farklı projeleriniz varsa yardımcı olabilir.

CMSClassUnloadingEnabled'ın UseConcMarkSweepGC ile uyumlu olarak PermGen alanını temiz tutmaya yardımcı olduğunu unutmayın, ancak kullandığınız çerçevelere bağlı olarak PermGen'de gerçek bir sızıntı olabilir ve bu da sonunda yeniden başlatmaya zorlar.


@iwein - javaOptions, sbt için varsayılan yığın alanını değiştirmedi. Jconsole'u kontrol ettim ve sadece -Xmx512M gösteriyor. SBT_OPTS'yi ~ / .sbtconfig içine eklesem bile, bunu jconsole'da alıyorum: -Xmx512M -Xms256M -Xmx1G -XX: MaxPermSize = 256M -XX: + UseConcMarkSweepGC. Xmx512'yi ön tarafta görüyor musunuz? Build.scala'dan javaOptions'ı nasıl seçmezsiniz. Herhangi bir işaret var mı?
Anand

@Anand belki 0.13'te işler biraz farklı çalışıyor? Bir şeyle karşılaşırsam cevabı güncelleyeceğim (biraz zaman alabilir), bu arada anlarsanız bana bildirin.
iwein

@iwein Build.scala dosyamda aşağıdakileri kullandım ve işe yaradı. fork in run: = true, javaOptions in run ++ = Seq ("- Xms256m", "-Xmx2048m", "-XX: + UseConcMarkSweepGC"). Yanıtı stackoverflow.com/questions/27372468/… için bu gönderiye bakın . Teşekkürler!
Anand

2
Bilginize .sbtopts, SBT projenizin kök dizininde dosyadakiyle aynı sözdizimini kullanarak bir dosya da oluşturabilirsiniz /usr/local/etc/sbtopts. Bu, projenizi bağımsız kılar ve CI durumlarında çok kullanışlı olabilir.
Mooij

0.13.9 (0.13.6 olabilir) kullanan Windows'ta dosya C: \ Program Files (x86) \ sbt \ conf \ sbtconfig.txt'dir. Varsayılan olarak, bu yanıtta -J gösterilmeyen dosyanın içinde "-Xmx512M" vardı. Bu dosyanın, sbt derlemesinin -XX: MaxPermSize ile ilgili bir uyarı vermesiyle okunduğunu doğrulayabilirim ve bu değeri değiştirdiğimde uyarı, başlangıçta gösterdiği "256m" değerini değil, girdiğim değeri gösterir.
Night Owl

69

SBT sürüm 12'den itibaren bunun için bir seçenek vardır:

$sbt -mem 2048 

5
8.1'de bu komut benim için çalışmadı:Not a valid command: mem (similar: set)
Kevin Meredith

43

Eğer sbt'yi linux kabuğunda çalıştırırsanız, kullanabilirsiniz:

env JAVA_OPTS="-Xmx512m" sbt run

Bu, sbt projemi çalıştırmak için genellikle kullandığım komuttur.


1
Çok teşekkür ederim. Bilmek harika bir komut. Bu "env" i hiç bilmiyordum ve böyle bir aracı birçok kez kaçırdım.
Ivan

4
Hmm, bu benim için işe yaramadı! override def forkYukarıdaki çözüme ihtiyacım vardı . (sbt 0.7.7)
Scott Morrison

2
sbt dosyanızın kendi JAVA_OPTS'sini belirtmesi mümkündür, bu durumda bunların üzerine yazılacaktır. Daha sonra, -Xmx bayrağını kaldırmak veya istediğiniz maksimum yığın boyutuna geçmek için sbt dosyanızı doğrudan değiştirebilirsiniz.
nnythm

23

.sbtconfigSBT'den itibaren kullanımdan kaldırıldı 0.13.6. Bunun yerine, bu seçenekleri /usr/local/etc/sbtoptsaşağıdaki şekilde yapılandırdım :

-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-Xss1Mbüyük kasa sınıfları için biraz düşük, 4M daha güvenli görünüyor.
Marius Soutier

7

Bildiğim bir yol var. Ortam değişkenini JAVA_OPTS ayarlayın.

JAVA_OPTS='-Xmx512m'

Bunu bir komut parametresi olarak yapmanın bir yolunu bulamadım.


7

Ortam değişkeniyle ayar yapmak için JAVA_OPTS kullanın.

Ayrı seçenekler için sbt yapmak için -JX seçeneklerini kullanın, örneğin -J-Xmx2048 -J-XX: MaxPermSize = 512

Sbt'nin daha yeni sürümlerinde "-mem" seçeneği bulunur.


5

Yukarıda javaOptions += "-XX:MaxPermSize=1024"@iwein tarafından atıfta bulunulan build.sbt dosyamız, sbt aracılığıyla Specs2 testleri çalıştırılırken atılan bir java.lang.OutOfMemoryError gördüğümüzde bizim için çalıştı.


1
@UwePlonus soruyu cevaplıyor.
VasiliNovikov

3

Ortam değişkeni, ayarlanması gereken _JAVA_OPTIONS şeklindedir. _JAVA_OPTIONS ayarını yaptıktan ve sbt yaptığınızda, sbt mesajı JAVA_OPTIONS ve değerleri kullanarak gösterecektir.

Alternatif olarak, sbt veya .scala dosyasında javaOption ayarlayabilirsiniz, örn.

javaOptions += "-Xmx1G"

Sbt kabuğundan, ayarlanmış değerleri görmek için show javaOptions'ı çalıştırabilirsiniz.


1
    javaOptions in Test += "-Xmx1G"

Bu, testler için JVM seçeneklerini ayarlar. Jvm forking ( fork in Test := true) ile de çalışır .


1
bu set nerede build.sbt?
javadba

1 modül projeniz varsa her yerde. SBT'de tanımların sırası genellikle önemli değildir. Birden fazla modülünüz varsa, bunu bazılarında veya isterseniz global olarak javaOptions in ThisBuild += "-Xmx1G"veya aracılığıyla javaOptions in (ThisBuild, Test) += "-Xmx1G"
belirtin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.