2017-02-23 10 views
12

Jestem nowy w Scala, sbt i jej REPL. Jedną z rzeczy, które naprawdę uwielbiam jest opcja ~ do zapętlenia przebiegu lub kompilacji podczas edycji plików. Tak często kończę pracę ~run.Is java.lang.OutOfMemoryError: Metaspace normal in sbt REPL?

Ale przecieka pamięć. Jak po 20-30 biegnie cały SBT awarii interaktywną powłokę z:

[info] Compiling 1 Scala source to /home/[redacted] 
sbt appears to be exiting abnormally. 
The log file for this session is at /tmp/sbt853875123365456892.log 
java.lang.OutOfMemoryError: Metaspace 
Error during sbt execution: java.lang.OutOfMemoryError: Metaspace 

szczerze to nie jest wielka sprawa, ale jednocześnie rozumiem co za OOME to pytanie staram się dowiedzieć - czy to naprawdę to, co To powinno być? Odpowiedź brzmi "nie", ale ...

  • czy to błąd sbt? (czy powinienem spróbować to zgłosić?)
  • coś jest nie tak z moim programem? (wyciek pamięci?)

Odpowiedz

10

Zasadniczo SBT, gdy kompiluje i uruchamia twój program, używa tylko jednej JVM - tej, z którą był uruchamiany. Jeśli coś jest w metaprzestrzeni, która nie może być zbędna, możesz w końcu zabraknąć pamięci - na przykład, jeśli utworzysz połączenie (zobaczyłem przykłady MongoDB lub ElasticSearch) i zapomnę zamknąć je przy wyłączaniu, to pozostanie ono otwarte od zbierania kilku obiektów - po kilku cyklach ponownego kompilowania i ponownego ładowania, kilka obiektów może zużyć twoją metaprzestrzeń.

Jest to przeciek pamięci, który zwykle nie wpłynie na twój program, ale SBT pokazuje go jako wyjątek, który zobaczyłeś.

W dłuższej perspektywie należy zidentyfikować wyciek i go usunąć, aby obejść ten problem, użyj rewolweru SBT, który pozwala uruchomić program w innej maszynie JVM - w ten sposób wycieki pamięci nie będą sumować się, ponieważ będzie tylko zamykaniem i uruchamianiem nowej maszyny JVM, zamiast uruchamiania wszystkiego w tej samej maszynie JVM, co SBT.

+0

Więc jeśli dobrze rozumiem, to co mówisz, to mój program, który przecieka z pamięci. –

+0

Najprawdopodobniej - wszystkie problemy z metaprzestrzeni SBT, które znalazłem w przeszłości, były pewnego rodzaju wyciekami pamięci w konkretnym programie - może to być twoja rola, może to być twoje biblioteki lub konfiguracja. Możesz spróbować dołączyć do SBT profilera i sprawdzić, co nie jest gromadzone pomiędzy przeładowaniami. –

+0

@MateuszKubuszok Również otrzymuję ten błąd w prostych przykładowych aplikacjach. Zastanawiam się, czy to ogólny problem, czy tylko z moimi ustawieniami. Otworzyłem problem [tutaj] (https://github.com/playframework/play-scala-compile-di-example/issues/51) –