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 2013

1
@iwein 내 게시물의 내용은 당신에게 매우 중요한 것 같습니다.
Arne 2015

2
하는 것으로 javaOptions만 갈래의 JVM (참조에 대한 영향을 scala-sbt.org/0.13/docs/Forking.html을 )
야르

1
fork in run := ture 활성화 추가javaOptions
coanor

@coanor이 답변은 고대 버전의 sbt입니다. 이 질문 바로 아래에 훨씬 더 높은 순위의 답변이 있습니다. 이 답변은 질문을했을 때 정답이었습니다.
Arne

113

분기 된 프로세스의 경우 Build.scala를 확인해야합니다.

분기 된 프로세스에 대한 자바 옵션을 수정하려면 다음과 같이 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. OOM을 방지하려면 올바른 jvm 옵션을 설정하십시오 (일반 및 PermGen 모두) :

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

현재 sbt 실행에 대해서만 SBT_OPTS를 설정하려면 env SBT_OPTS=".." sbtGoogol Shan이 제안한대로 사용할 수 있습니다 . 또는 Sbt 12 :에서 추가 된 옵션을 사용할 수 있습니다 sbt -mem 2048. 옵션 목록이 길면 다루기 어렵지만 요구 사항이 다른 프로젝트가있는 경우 도움이 될 수 있습니다.

UseConcMarkSweepGC와 함께 CMSClassUnloadingEnabled는 PermGen 공간을 깨끗하게 유지하는 데 도움이되지만 사용하는 프레임 워크에 따라 PermGen에 실제 누출이있을 수 있으며 결국 강제로 다시 시작됩니다.


@iwein-javaOptions가 sbt의 기본 힙 공간을 변경하지 않았습니다. jconsole을 확인했는데 -Xmx512M 만 표시됩니다. ~ / .sbtconfig에 SBT_OPTS를 추가하더라도 여전히 jconsole에서 다음을 얻습니다. -Xmx512M -Xms256M -Xmx1G -XX : MaxPermSize = 256M -XX : + UseConcMarkSweepGC. Xmx512가 앞쪽에 보이나요? Build.scala에서 javaOptions를 선택하지 않는 방법이 있습니다. 포인터가 있습니까?
Anand

@Anand 아마도 0.13에서 약간 다르게 작동합니까? 내가 무언가에 부딪히면 답변을 업데이트하겠습니다 (시간이 걸릴 수 있음). 그동안 알아 내면 알려주세요.
iwein 2014

@iwein 방금 Build.scala에서 다음을 사용했으며 작동했습니다. fork in run : = true, javaOptions in run ++ = Seq ( "-Xms256m", "-Xmx2048m", "-XX : + UseConcMarkSweepGC"). 답변 stackoverflow.com/questions/27372468/…에 대한이 게시물을 참조하십시오 . 감사!
Anand

2
참고로 .sbtopts파일과 동일한 구문을 사용하여 SBT 프로젝트의 루트에 파일을 만들 수도 있습니다 /usr/local/etc/sbtopts. 이것은 프로젝트를 독립적으로 만들어 CI 상황에서 매우 편리 할 수 ​​있습니다.
Age Mooij

0.13.9 (0.13.6 일 수 있음)를 사용하는 Windows에서 파일은 C : \ Program Files (x86) \ sbt \ conf \ sbtconfig.txt입니다. 기본적으로 파일에는이 답변에 -J가 표시되지 않고 "-Xmx512M"이 있습니다. sbt 어셈블리가 -XX : MaxPermSize에 대한 경고를 발행하고이 값을 변경하면 경고에 원래 표시된 "256m"값이 아니라 입력 한 값이 표시된다는 사실에 의해이 파일을 읽고 있음을 확인할 수 있습니다.
Night Owl

68

sbt 버전 12 이후에는 이에 대한 옵션이 있습니다.

$sbt -mem 2048 

5
승리 8.1에이 명령은 나를 위해 일을하지 않았다 :Not a valid command: mem (similar: set)
케빈 메러디스

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를 지정할 수 있으며이 경우 이러한 항목을 덮어 씁니다. 그런 다음 -Xmx 플래그를 제거하거나 원하는 최대 힙 크기로 전환하기 위해 sbt 파일을 직접 수정할 수 있습니다.
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큰 케이스 클래스의 경우 약간 낮으며 4M이 더 안전한 것 같습니다.
Marius Soutier 2015

7

내가 아는 한 가지 방법이 있습니다. 환경 변수 JAVA_OPTS를 설정합니다.

JAVA_OPTS='-Xmx512m'

명령 매개 변수로이 작업을 수행하는 방법을 찾지 못했습니다.


7

환경 변수로 설정하려면 JAVA_OPTS를 사용하십시오.

-JX 옵션을 사용하여 개별 옵션에 대해 sbt (예 : -J-Xmx2048 -J-XX : MaxPermSize = 512)

최신 버전의 sbt에는 "-mem"옵션이 있습니다.


5

javaOptions += "-XX:MaxPermSize=1024"sbt를 통해 Specs2 테스트를 실행하는 동안 발생한 java.lang.OutOfMemoryError를 보았을 때 위의 @iwein에서 참조한 build.sbt 의 는 우리를 위해 일했습니다.


1
@UwePlonus는 질문에 답합니다.
VasiliNovikov 2015 년

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)으로도 작동 ( fork in Test := true).


1
이 세트는 어디에 build.sbt있습니까?
javadba

1 모듈 프로젝트가있는 경우 어디서나. 정의 순서는 일반적으로 SBT에서 중요하지 않습니다. 여러 모듈이있는 경우, 그 중 일부에 하나이 지정하거나, 원하는 경우, 전 세계적으로 통해 javaOptions in ThisBuild += "-Xmx1G"또는javaOptions in (ThisBuild, Test) += "-Xmx1G"
VasiliNovikov

1

sbt를 사용하면 다음과 같은 파일에서 프로젝트를 실행하는 데 필요한 JVM 옵션을 나열 할 수 있습니다.

.jvmopts

프로젝트의 루트에 있습니다. 그런 다음 원하는 Java 옵션을 추가하십시오.

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

Windows 10 https://www.lagomframework.com/documentation/1.4.x/scala/JVMMemoryOnDev.html 에서 테스트되고 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.