SBTで「実行」アクションを使用してアプリケーションを実行するためのJVM最大ヒープサイズ「-Xmx」を指定する方法


97

私のアプリケーションは大規模なデータ配列処理を行い、JVMがデフォルトで提供するよりも多くのメモリを必要とします。Javaでは「-Xmx」オプションで指定されています。特定の「-Xmx」値を使用して「実行」アクションでアプリケーションを実行するようにSBTを設定するにはどうすればよいですか?

回答:


17

これを試して:

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
これは古くなり、使用できるようになりましたjavaOptions += "-Xmx1G"
iwein

1
@iwein私の投稿の内容はあなたにとって非常に重要なようです。
Arne

2
javaOptionsフォークされたJVMにのみ効果があることに注意してください(scala-sbt.org/0.13/docs/Forking.htmlを参照)
Yar

1
追加はfork in run := ture 可能javaOptions
coanor

@coanorこの回答は、sbtの古いバージョン用です。これのすぐ下にはるかに高いランキングがある答えがあります。この答えは、質問されたときの正解でした。
アルネ

113

フォークされたプロセスについては、Build.scalaを見てください。

フォークされたプロセスのJavaオプションを変更するには、次のように、Build.scala(またはビルドに名前を付けたもの)でそれらを指定する必要があります。

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

これは、グローバルJAVA_OPTSを変更することなく、あなたに適切なオプションを提供します、そしてそれはでカスタムJAVA_OPTSを置く起動スクリプト生成SBT

以下のために非フォークのプロセスには、経由して設定を設定することが最も便利ですsbtoptsか、sbtconfigあなたのsbtのバージョンによって異なります。

sbt 0.13.6 .sbtconfigは非推奨です/usr/local/etc/sbtoptsこれらの線に沿って変更します。

-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

.sbtoptsファイルと同じ構文を使用して、SBTプロジェクトのルートにファイルを作成することもでき/usr/local/etc/sbtoptsます。これにより、プロジェクトは自己完結型になります。

sbt 0.13.6より前では、フォークされていないプロセスのオプションを.sbtconfigで設定できました:

  1. sbtの場所を確認します。

    $ which sbt
    /usr/local/bin/sbt
  2. 内容を見てください:

    $ 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. 正しいjvmオプションを設定して、OOMを防止します(通常とPermGenの両方):

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

現在のsbtの実行に対してのみSBT_OPTSを設定したい場合は、Googol env SBT_OPTS=".." sbtShanの提案に従って使用できます。または、Sbt 12で追加されたオプションを使用できますsbt -mem 2048。これは、オプションのリストが長くなると扱いにくくなりますが、ニーズが異なるさまざまなプロジェクトがある場合に役立つことがあります。

CMSClassUnloadingEnabledをUseConcMarkSweepGCと組み合わせて使用​​すると、PermGenスペースをクリーンに保つことができますが、使用するフレームワークによっては、PermGenで実際にリークが発生し、最終的に再起動が強制される場合があります。


@iwein-javaOptionsは、sbtのデフォルトのヒープスペースを変更しませんでした。jconsoleをチェックインすると、-Xmx512Mと表示されます。〜/ .sbtconfigにSBT_OPTSを追加しても、jconsoleに次のように表示されます:-Xmx512M -Xms256M -Xmx1G -XX:MaxPermSize = 256M -XX:+ UseConcMarkSweepGC。正面にXmx512が見えますか?Build.scalaからjavaOptionsを選択しない方法があります。ポインタはありますか?
Anand

@アナンドおそらく0.13では物事は少し異なって動作していますか?何かにぶつかったら(しばらく時間がかかるかもしれません)答えを更新します。その間にそれがわかった場合はお知らせください。
iwein 14

@iwein Build.scalaで次のコードを使用したところ、うまくいきました。実行中のフォーク:= true、実行中のjavaOptions ++ = Seq( "-Xms256m"、 "-Xmx2048m"、 "-XX:+ UseConcMarkSweepGC")。回答Stackoverflow.com/questions/27372468/…については、この投稿を参照してください。ありがとう!
アナンド14

2
参考までに、.sbtoptsファイルと同じ構文を使用してSBTプロジェクトのルートにファイルを作成することもでき/usr/local/etc/sbtoptsます。これにより、プロジェクトは自己完結型になり、CIの状況で非常に便利です。
Mooijの年齢16年

0.13.9(0.13.6の可能性があります)を使用するWindowsでは、ファイルはC:\ Program Files(x86)\ sbt \ conf \ sbtconfig.txtです。デフォルトでは、このファイルには「-Xmx512M」があり、この回答に-Jが表示されていません。sbtアセンブリが-XX:MaxPermSizeに関する警告を発行し、その値を変更すると警告が最初に表示した「256m」の値ではなく、入力した値を表示することで、このファイルが読み取られていることを確認できます。
Night Owl


43

Linuxシェルでsbtを実行する場合、以下を使用できます。

env JAVA_OPTS="-Xmx512m" sbt run

これは、私のsbtプロジェクトを実行するために通常使用するコマンドです。


1
どうもありがとうございました。知っておくと便利なコマンドです。私はその「env」を知らず、そのようなツールを何度も見逃していました。
Ivan、

4
うーん、これは私にはうまくいきませんでした!override def fork上記の解決策が必要でした。(sbt 0.7.7)
スコットモリソン、

2
sbtファイルが独自のJAVA_OPTSを指定している可能性があります。その場合、これらは上書きされます。次に、sbtファイルを直接変更して、-Xmxフラグを削除するか、それを目的の最大ヒープサイズに切り替えることができます。
nnythm

23

.sbtconfigSBT以降、非推奨です0.13.6。代わりに、これらのオプションを/usr/local/etc/sbtopts次のように構成しました。

-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-Xss1M大きなケースクラスの場合は少し低いです。
Marius Soutier

7

私が知る方法は1つあります。環境変数JAVA_OPTSを設定します。

JAVA_OPTS='-Xmx512m'

コマンドパラメータとしてこれを行う方法が見つかりません。


7

環境変数で設定するには、JAVA_OPTSを使用します。

個々のオプションのsbtに-JXオプションを使用します。例:-J-Xmx2048 -J-XX:MaxPermSize = 512

新しいバージョンのsbtには「-mem」オプションがあります。


5

上記のjavaOptions += "-XX:MaxPermSize=1024"@iweinで参照されているbuild.sbtのは、sbtを介してSpecs2テストを実行しているときにjava.lang.OutOfMemoryErrorがスローされるのを見ているときに機能しました。


1
@UwePlonusそれは質問に答えます。
VasiliNovikov

3

環境変数は_JAVA_OPTIONSであり、設定する必要があります。_JAVA_OPTIONSを設定すると、sbtを実行すると、sbtはJAVA_OPTIONSと値を使用してメッセージを表示します。

または、sbtまたは.scalaファイルでjavaOptionを設定することもできます。

javaOptions += "-Xmx1G"

sbtシェルからshow javaOptionsを実行して、設定されている値を確認できます。


1
    javaOptions in Test += "-Xmx1G"

これにより、テストのJVMオプションが設定されます。jvmフォーク(fork in Test := true)でも機能します。


1
これはどこに設定されていbuild.sbtますか?
javadba 2017年

1モジュールプロジェクトの場合はどこでも。SBTでは、定義の順序は一般に重要ではありません。複数のモジュールがある場合は、一部のモジュールで指定するか、または必要に応じて、javaOptions in ThisBuild += "-Xmx1G"またはを介してグローバルに指定しますjavaOptions in (ThisBuild, Test) += "-Xmx1G"
VasiliNovikov

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.