code

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

codestyles 2020. 10. 9. 11:13
반응형

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


내 스칼라 컴파일러의 이상한 동작을 발견했습니다. 클래스를 컴파일 할 때 가끔 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를 통해 컴파일합니다.

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


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


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


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

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

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

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


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

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

user-profile$ sbt

그때,

sbt-project-name 0.1> clean

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


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

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

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

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


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


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

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

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"

참고 URL : https://stackoverflow.com/questions/8331135/how-to-prevent-java-lang-outofmemoryerror-permgen-space-at-scala-compilation

반응형