Scala 컴파일에서 java.lang.OutOfMemoryError : PermGen 공간을 방지하는 방법은 무엇입니까?


79

내 스칼라 컴파일러의 이상한 동작을 발견했습니다. 클래스를 컴파일 할 때 가끔 OutOfMemoryError가 발생합니다. 다음은 오류 메시지입니다.

[info] Compiling 1 Scala source to /Users/gruetter/Workspaces/scala/helloscala/target/scala-2.9.0/test-classes...
java.lang.OutOfMemoryError: PermGen space
Error during sbt execution: java.lang.OutOfMemoryError: PermGen space

가끔 한 번만 발생하며 일반적으로 후속 컴파일 실행에서 오류가 발생하지 않습니다. 저는 Scala 2.9.0을 사용하고 SBT를 통해 컴파일합니다.

이 오류의 원인이 무엇인지에 대한 단서가 있습니까? 귀하의 통찰력에 미리 감사드립니다.


답은 여기에 또한 작동 java.lang.OutOfMemoryError: Metaspace바꿀 경우 (자바 8에서 실행 스칼라에 해당하는 문제) MaxPermSize와 함께 MaxMetaspaceSize.
브라이언 McCutchon

답변:


46

그 원인 OutOfMemoryError: PermGen space영구 생성 공간 이 충분하지 않기 때문입니다. :) Oracle JVM을 사용하는 경우 스크립트에 -XX:MaxPermSize=256M인수 (또는 다른 양의 공간) 를 추가해야합니다 sbt. 다른 JVM의 경우 해당 설명서를 참조하십시오.


1
감사합니다 Alexey. 이미 -Xmx512M 옵션을 사용했습니다. 같은 효과가 있어야한다고 생각합니다. 그럼에도 불구하고 -XX : MaxPermSize 매개 변수를 추가했으며 오류가 지속되는지 확인합니다.
BumbleGee 2011

3
@BumbleGee 아니요,에 의해 추가 된 메모리 -Xmx는 PermGen에 사용할 수 없습니다.
Alexey Romanov

명확히 해주셔서 감사합니다, Alex.
BumbleGee

6
SBT 재시작으로 수정 된 예외가 발생하기 전에 프로그램이 약 3-5 회 성공적으로 컴파일되고 실행되므로 SBT의 메모리 누수처럼 보입니다.
Ivan

4
의 현재 버전은 sbt당신이 필요로 -J-XX:MaxPermSize=256M하는 대신 -XX:MaxPermSize=256M. Tvaroh의 대답은 더 정확하고 완전하며 질문을 재미있게 만들지 않습니다.
Daniel Darabos

99

나는 OS X의 그것은 지원에 SBT를 설치하는 사제를 사용 SBT_OPTS에 넣어 수 있습니다 인수 ~/.sbtconfig로 파일을 export SBT_OPTS=-XX:MaxPermSize=256M.


1
Homebrew는 SBT로 개발할 때 매우 관리하기 쉬운 패키지 솔루션 인 것 같습니다. :)
crockpotveggies 2013 년

sbt brew 설치 스크립트는 메모리 최대 값을 너무 작게 설정하고 Java 부분에서 -Xmx512M을 제거합니다.-cat which sbt#! / bin / sh test -f ~ / .sbtconfig &&. ~ / .sbtconfig exec java -Xmx512M $ {SBT_OPTS} -jar /usr/local/Cellar/sbt/0.13.1/libexec/sbt-launch.jar "$ @"
ski_squaw

scala-sbt.org/release/docs/Getting-Started/Setup.html에 좋은 SBT_OPTS 설정이 있습니다
ski_squaw 2014

Windows set SBT_OPTS = -XX : MaxPermSize = 512M에서 저를 위해 일했습니다
Alex Punnen

Use of ~/.sbtconfig is deprecated, please migrate global settings to /usr/local/etc/sbtopts, Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
Narfanator

36

sbt 0.13.6 이상을 사용하고 있다고 가정했습니다 . 다음 내용으로 sbt 프로젝트의 루트에 .sbtopts파일을 만듭니다 .

-J-Xmx4G
-J-XX:MaxMetaspaceSize=1G
-J-XX:MaxPermSize=1G
-J-XX:+CMSClassUnloadingEnabled

MaxMetaspaceSizeJava 8 용이고 MaxPermSizeJava 7 용 입니다. 이는 permgen 또는 메타 공간 소모 와 관련된 메모리 부족 오류를 방지하는 데 중요합니다 . 물론 플래그 값을 조정하거나 필요한 다른 플래그를 추가하는 것을 고려하십시오.

자세한 내용과 대안은이 블로그 게시물 에서 확인할 수 있습니다 .


큰. 이러한 옵션을 전역 구성 파일에 넣을 수도 있습니다. 나를 위해 그것은 /usr/local/etc/sbtopts(Mac에서 Homebrew와 함께 설치된 sbt의 경우)입니다.
Brian McCutchon

5

나는이 문제가 있었고 메모리 크기를 변경하려는 사이트를 보면서 10 분 동안 놀았습니다.

내가 그것을 해결 한 것으로 밝혀졌습니다.

user-profile$ sbt

그때,

sbt-project-name 0.1> clean

이것은 나를 위해 그것을 정리했습니다.


4

내 경우에는 SBT 재시작으로 수정 된 예외가 발생하기 전에 프로그램이 약 3-5 번 성공적으로 컴파일되고 실행되므로 SBT에서 메모리 누수가 발생하는 것 같습니다.

-XX:MaxPermSize=Alexey Romanov가 제안한 것처럼 실제로 가장 적절한 솔루션은 JVM 매개 변수로 보이거나 도움이되는 경우 SBT를 주기적으로 다시 시작하는 것입니다.

그러나 또 다른 흥미로운 방법이 있습니다. Java 8로 전환 해보십시오 . AFAIK는 더 이상 PermGen을 사용하지 않으며 아마도 이런 방식으로이 예외에 영향을받지 않을 것입니다.

나는 여전히 SBT 작성자가 향후 버전에서이 문제를 해결하기를 바랍니다.


그렇다면 Java 8은 다른 메모리 시스템을 사용합니까?
Adrian

J8에서 perm gen은 메모리 힙 공간으로 롤링됩니다.
sksamuel

Java 8을 사용하면 SBT가 적어도 내 Mac에서 컴파일되지 않습니다. Java 7로 다운 그레이드해야합니다.
Siyuan Ren

아마도 당신은 뭔가 잘못하고있는 것 같습니다. 아마도 당신이 얻은 컴파일러 오류 메시지를 보여줄 수 있습니까?
Ivan

도와 주겠다고 제안 해주셔서 감사합니다.하지만 다시는 복잡한 과정을 거치지 않기로 결정했습니다. 당분간은 Java 7을 고수하겠습니다.
Siyuan Ren

2

Jenkins sbt 플러그인으로 구축 중이며 동일한 문제가 발생했습니다. sbt 파일에서 Jenkins 작업 구성의 JVM 플래그로 SBT_OPTS를 복사 한 후 문제가 해결되었습니다.


2

원래 다음과 같은 명령을 사용합니다.

java -jar /path/to/sbt-launch.jar test

내가 먼저 OutOfMemoryError를 가지고 : PermGen 공간 내가 사용 해결 -XX:MaxPermSize하고 OutOfMemoryError가 : 자바 힙 공간은 , 어떤을 -Xmx구제했다.

따라서 제 경우에는 다음과 같은 명령이 작동했습니다.

java -XX:MaxPermSize=256M -Xmx2048M -jar /path/to/sbt-launch.jar test

0

sbt.sh 파일에서 다음 코드 블록을 변경하고 제대로 작동하도록 저장하십시오.

get_mem_opts () {
  local mem=${1:-1536}
  local perm=$(( $mem / 4 ))
  (( $perm > 256 )) || perm=1024 //256 to 1024
  (( $perm < 1024 )) || perm=2048 // 1024 to 2048
  local codecache=$(( $perm / 2 ))

  echo "-Xms${mem}m -Xmx${mem}m -XX:MaxPermSize=${perm}m -XX:ReservedCodeCacheSize=${codecache}m"
}

또는

터미널을 사용하여 sbt 구성 내보내기

export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.