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.