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
MaxMetaspaceSize
Java 8 용이고 MaxPermSize
Java 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"
'code' 카테고리의 다른 글
C에서 텍스트 파일을 읽고 모든 문자열을 인쇄하는 방법 (0) | 2020.10.09 |
---|---|
텍스트를 클릭하여 해당 라디오 버튼 선택 (0) | 2020.10.09 |
ListViewItem은 ListView의 너비로 늘어나지 않습니다. (0) | 2020.10.09 |
CouchDB에서 트랜잭션과 잠금을 할 수 있습니까? (0) | 2020.10.09 |
Windows의 Python os.path.join (0) | 2020.10.09 |