2013-03-14 9 views
8

Aktualizuję kod z 2.9.1 do 2.10.0 (i próbowałem 2.10.1 z tymi samymi wynikami), używając SBT 0.12.1 w obu przypadkach.Scala 2.10 kompilator zajmuje 10 razy więcej czasu po raz pierwszy w SBT

Po uruchomieniu sbt clean compile w linii komend obie są zakończone po około 250 sekundach.

Jednak, gdy biegnę sbt interaktywnie, a następnie kilkakrotnie wprowadzić cleancompile moi 2.9 kompiluje się szybciej, ale moi 2.10 kompiluje się 10x wolniej.

Jeśli użyję sterty o wielkości 768 m, w 2.1 kompilacji zabraknie pamięci. Przy wielkości sterty wynoszącej 4 g jest on w stanie skompilować za każdym razem, ale zawsze 10 razy wolniej po pierwszej iteracji.

[success] Total time: 258 s, completed Mar 14, 2013 10:44:34 AM 
[success] Total time: 2048 s, completed Mar 14, 2013 11:23:03 AM 
[success] Total time: 2049 s, completed Mar 14, 2013 11:58:42 AM 
[success] Total time: 2047 s, completed Mar 14, 2013 12:43:19 PM 

Jaki jest najlepszy sposób debugowania, aby dowiedzieć się, co się dzieje?

+2

mógłbyś przechwycić zrzut stosu na tym 'OutOfMemoryError' postępując zgodnie z poniższymi instrukcjami: http://www.oracle.com/technetwork/ java/javase/memleaks-137499.html # gdyrr? Jeśli możesz mi ją udostępnić (jason dot zaugg na typesafe dot com), mógłbym cię poszukać. – retronym

+1

Ponadto, jeśli można opublikować pełne dane wyjściowe kompilacji i opcje JVM, może pojawić się problem. np. czy widzisz http://blogs.atlassian.com/2012/05/codecache-is-full-compiler-has-been-disabled/? – retronym

Odpowiedz

7

Dziękuję retronym za CodeCache link. Początkowo go odrzuciłem, ponieważ użycie sugerowanej opcji -XX:+UseCodeCacheFlushing nie przyniosło żadnych ulepszeń, ale próbowałem po prostu użyć -XX:ReservedCodeCacheSize=2g i to rozwiązało problem.

Czy ktoś wie, dlaczego -XX:+UseCodeCacheFlushing nie pomaga, lub niektóre zalecane wartości dla wszystkich opcji java pamięci podręcznej kodu?

Dla zabawy, tutaj są moje wynikające kompilacji razy stosując -XX:+HeapDumpOnOutOfMemoryError -server -XX:ReservedCodeCacheSize=2g -Xmx4g -Xss4M -XX:MaxPermSize=512M -XX:+DoEscapeAnalysis -XX:+UseCompressedOops -XX:+CMSClassUnloadingEnabled -XX:+UseCodeCacheFlushing

2.10.1 (interactive, repeating clean/compile) 
    194 s 
    149 s 
    95 s 
    87 s 
    84 s 
2.9.1 (interactive, repeating clean/compile) 
    187 s 
    129 s 
    83 s 
    77 s 
    74 s 
2.10.1 (batch sbt clean compile) 
    195 s 
2.9.1 (batch sbt clean compile) 
    177 s 
+1

Ustawienie '-XX: ReservedCodeCacheSize' na 128m działa równie dobrze jak 2g – Mike

0

Możesz zacząć od dołączenia profilera lub monitora, aby zobaczyć, co się dzieje z GC. Aby uzyskać wstępne wyobrażenie o tym, co należy zrobić, wystarczy narzędzie magazynowe, takie jak JVisualVM. Oczywiście, jeśli masz YourKit, to też by się dobrze sprawdziło.

Addenddum

Jako łagodnie ciekawe, ale teraz w dużej mierze bez znaczenia na bok, ja niedawno odkryto, że Scala 2.9.0-1 był potwornie powolny podczas kompilacji testy Specs2 (niezmienny, przynajmniej). Przejście na wersję 2.9.1 miało ogromną różnicę. Zauważyłem to tylko wtedy, gdy musiałem dodać testy jednostkowe do projektu, który wcześniej nie miał żadnych, a czasy kompilacji stały się męczące. W przeczuciu przełączyłem się na 2.9.1 i wszystko wróciło do normy.

+0

Patrzyłem z jvisualvm. Wydaje się, że nie ma nic podejrzanego z GC (hałdy mają dużo wolnej przestrzeni, nie spędzają zbyt wiele czasu na GC). Próbkowanie procesora również niewiele mi wskazuje (23% czasu w Object.hashCode, reszta to <5%). Profiler pamięci nigdy nie wydaje się być gotowym przedefiniowaniem klas. Masz pomysł, gdzie szukać? – Mike

Powiązane problemy