Ich habe ein seltsames Verhalten meines Scala-Compilers bemerkt. Beim Kompilieren einer Klasse wird gelegentlich ein OutOfMemoryError ausgelöst. Hier ist die Fehlermeldung:
[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
Es kommt nur gelegentlich vor und der Fehler wird normalerweise beim nachfolgenden Kompilierungslauf nicht ausgelöst. Ich benutze Scala 2.9.0 und kompiliere über SBT.
Hat jemand eine Ahnung, was die Ursache für diesen Fehler sein könnte? Vielen Dank im Voraus für Ihre Erkenntnisse.
scala
apache-spark
memory-management
sbt
scalatra-sbt
BumbleGee
quelle
quelle
java.lang.OutOfMemoryError: Metaspace
(das Äquivalent Problem für Scala läuft auf Java 8) , wenn Sie ersetzenMaxPermSize
mitMaxMetaspaceSize
.Antworten:
Die Ursache dafür
OutOfMemoryError: PermGen space
ist, dass nicht genügend permanenter Generierungsspeicher vorhanden ist :) Wenn Sie Oracle JVM verwenden, müssen Sie-XX:MaxPermSize=256M
Ihremsbt
Skript das Argument (oder eine andere Menge an Speicherplatz) hinzufügen . Weitere JVMs finden Sie in deren Dokumentation.quelle
-Xmx
kann nicht für PermGen verwendet werden.sbt
benötigen Sie-J-XX:MaxPermSize=256M
statt-XX:MaxPermSize=256M
. Tvarohs Antwort ist genauer und vollständiger und macht sich über die Frage nicht lustig.Ich verwende HomeBrew, um sbt unter OS X zu installieren. Es unterstützt ein
SBT_OPTS
Argument, mit dem eine~/.sbtconfig
Datei erstellt werden kannexport SBT_OPTS=-XX:MaxPermSize=256M
.quelle
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
Ich nahm an, dass Sie sbt 0.13.6 oder höher verwenden. Erstellen Sie eine
.sbtopts
Datei im Stammverzeichnis Ihres sbt- Projekts mit folgendem Inhalt:-J-Xmx4G -J-XX:MaxMetaspaceSize=1G -J-XX:MaxPermSize=1G -J-XX:+CMSClassUnloadingEnabled
MaxMetaspaceSize
ist für Java 8, währendMaxPermSize
es für Java 7 ist. Sie sind wichtig , um Speicherfehler zu vermeiden, die entweder auf Permgen- oder Metaspace- Erschöpfung zurückzuführen sind. Erwägen Sie natürlich, die Flag-Werte anzupassen oder andere erforderliche Flags hinzuzufügen.Weitere Details und alternative Ansätze finden Sie in diesem Blogbeitrag .
quelle
/usr/local/etc/sbtopts
(für sbt mit Homebrew auf Mac installiert).Ich hatte dieses Problem und spielte 10 Minuten lang damit herum, während ich mir Websites ansah, die versuchten, die Speichergröße zu ändern.
Es stellte sich heraus, dass ich es gelöst habe durch,
Dann,
sbt-project-name 0.1> clean
Das hat es für mich geklärt.
quelle
Es sieht für mich wie ein Speicherverlust in SBT aus, da in meinem Fall das Programm etwa 3-5 Mal erfolgreich kompiliert und ausgeführt wird, bevor die Ausnahme auftritt, die durch den Neustart von SBT behoben wird.
Die am besten geeignete Lösung scheint in der Tat der
-XX:MaxPermSize=
JVM-Parameter zu sein, wie Alexey Romanov vorschlägt, oder SBT regelmäßig neu zu starten, wenn dies hilfreich ist.Es gibt aber noch einen anderen interessanten Weg: Versuchen Sie, auf Java 8 umzusteigen . AFAIK verwendet PermGen nicht mehr und ist auf diese Weise wahrscheinlich gegen diese Ausnahme immun.
Ich hoffe immer noch, dass SBT-Autoren dieses Problem in zukünftigen Versionen beheben werden.
quelle
Ich baue mit dem Jenkins sbt Plugin und hatte die gleichen Probleme. Sie wurden behoben, nachdem SBT_OPTS aus der sbt-Datei in die JVM-Flags der Jenkins-Jobkonfiguration kopiert wurde.
quelle
Ursprünglich mit einem Befehl wie:
Ich habe zuerst OutOfMemoryError: PermGen-Speicherplatz, den ich mit gelöst habe
-XX:MaxPermSize
, und dann OutOfMemoryError: Java-Heap-Speicherplatz , für-Xmx
den Abhilfe geschaffen wurde.In meinem Fall funktionierte ein Befehl wie dieser:
java -XX:MaxPermSize=256M -Xmx2048M -jar /path/to/sbt-launch.jar test
quelle
Ändern Sie den folgenden Codeblock in der Datei sbt.sh und speichern Sie die Funktion.
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" }
oder
Verwenden des Terminals zum Exportieren der sbt-Konfiguration
export SBT_OPTS="-XX:+CMSClassUnloadingEnabled -XX:PermSize=1024M -XX:MaxPermSize=2048M"
quelle