Zauważyłem dziwne zachowanie mojego kompilatora Scala. Czasami podczas kompilowania klasy zgłasza OutOfMemoryError. Oto komunikat o błędzie:
[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
Dzieje się to tylko raz na jakiś czas, a błąd zwykle nie jest zgłaszany przy kolejnym uruchomieniu kompilacji. Używam Scali 2.9.0 i kompiluję przez SBT.
Czy ktoś ma wskazówkę, co może być przyczyną tego błędu? Z góry dziękuję za spostrzeżenia.
scala
apache-spark
memory-management
sbt
scalatra-sbt
BumbleGee
źródło
źródło
java.lang.OutOfMemoryError: Metaspace
(odpowiednik problem dla Scala działa na Java 8), jeśli zastąpiMaxPermSize
sięMaxMetaspaceSize
.Odpowiedzi:
Przyczyną
OutOfMemoryError: PermGen space
jest to, że nie ma wystarczająco dużo miejsca na generowanie. Jeśli używasz Oracle JVM, musisz dodać-XX:MaxPermSize=256M
argument (lub inną ilość miejsca) do swojegosbt
skryptu. W przypadku innych maszyn JVM zajrzyj do ich dokumentacji.źródło
-Xmx
nie może być używana dla PermGen.sbt
potrzebujesz-J-XX:MaxPermSize=256M
zamiast-XX:MaxPermSize=256M
. Odpowiedź Tvaroha jest dokładniejsza i bardziej kompletna, a ponadto nie wyśmiewa pytania.Używam HomeBrew do instalacji sbt na OS X. Obsługuje
SBT_OPTS
argument, który można wstawić do~/.sbtconfig
plikuexport SBT_OPTS=-XX:MaxPermSize=256M
.źródło
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 "$ @"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
Zakładam, że używasz sbt 0.13.6 lub nowszego. Utwórz
.sbtopts
plik w katalogu głównym swojego projektu SBT z następującą zawartością:-J-Xmx4G -J-XX:MaxMetaspaceSize=1G -J-XX:MaxPermSize=1G -J-XX:+CMSClassUnloadingEnabled
MaxMetaspaceSize
jest dla Javy 8, aMaxPermSize
dla Javy 7. Są one krytyczne dla zapobiegania błędom braku pamięci związanym z permgen lub metaspace wyczerpaniem . Oczywiście rozważ dostosowanie wartości flag lub dodanie innych wymaganych flag.Więcej szczegółów i alternatywnych podejść można znaleźć w tym poście na blogu .
źródło
/usr/local/etc/sbtopts
(dla sbt zainstalowanego z Homebrew na Macu).Miałem ten problem, bawiłem się nim przez 10 minut, patrząc na strony próbujące zmienić rozmiar pamięci.
Okazuje się, że rozwiązałem to przez
Następnie,
sbt-project-name 0.1> clean
To wyjaśniło mi to.
źródło
Wygląda to na wyciek pamięci w SBT, ponieważ w moim przypadku program kompiluje się i działa z powodzeniem około 3-5 razy, zanim trafi w wyjątek, który jest naprawiany przez restart SBT.
Wydaje się, że najbardziej odpowiednim rozwiązaniem wydaje się być
-XX:MaxPermSize=
parametr JVM, jak sugeruje Alexey Romanov, lub okresowe ponowne uruchamianie SBT, jeśli to pomaga.Ale jest inny interesujący sposób: spróbuj przejść na Javę 8 . AFAIK nie używa już PermGen i prawdopodobnie jest w ten sposób odporny na ten wyjątek.
Nadal mam nadzieję, że autorzy SBT zajmą się tym problemem w przyszłych wersjach.
źródło
Buduję za pomocą wtyczki Jenkins sbt i miałem te same problemy. Zostały rozwiązane po skopiowaniu SBT_OPTS z pliku sbt do flag JVM konfiguracji zadania Jenkinsa.
źródło
Pierwotnie przy użyciu polecenia takiego jak:
Dostałem najpierw przestrzeń OutOfMemoryError: PermGen, którą rozwiązałem za pomocą
-XX:MaxPermSize
, a następnie OutOfMemoryError: przestrzeń sterty Java , na którą-Xmx
było lekarstwem.Więc w moim przypadku takie polecenie zadziałało:
java -XX:MaxPermSize=256M -Xmx2048M -jar /path/to/sbt-launch.jar test
źródło
zmień następujący blok kodu w pliku sbt.sh i zapisz jego działanie.
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" }
lub
za pomocą terminala do eksportu sbt config
export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"
źródło