2013-03-14 3 views
8

Ich aktualisiere einige Code von 2.9.1 zu 2.10.0 (und ich versuchte 2.10.1 mit den gleichen Ergebnissen), mit SBT 0.12.1 in beiden Fällen.Scala 2.10 Compiler dauert 10x länger nach dem ersten Mal in SBT

Wenn ich sbt clean compile in der Befehlszeile ausführen, sind beide nach etwa 250 Sekunden abgeschlossen.

Allerdings, wenn ich sbt interaktiv ausführen, und geben Sie wiederholt clean dann compile, meine 2.9 kompiliert schneller, aber mein 2.10 compiliert bekommen 10x langsamer.

Wenn ich eine Heap-Größe von 768m verwenden, 2.10 nicht mehr genügend Speicher auf der 3. Kompilierung. Mit einer Heap-Größe von 4g kann es jedes Mal kompiliert werden, aber nach der ersten Iteration immer 10x langsamer.

[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 

Was ist der beste Weg für mich zu debuggen, um herauszufinden, was los ist?

+2

Könnten Sie bitte ein Heapdump auf erfassen, dass 'OutOfMemoryError' mit diesen Schritten: http://www.oracle.com/technetwork/ java/javase/memleaks-137499.html # gdyrr? Wenn du es mir zur Verfügung stellen kannst (jason dot zaugg bei typesafe dot com), könnte ich mich nach dir umsehen. – retronym

+1

Wenn Sie die Ausgabe des vollständigen Builds und die JVM-Optionen veröffentlichen könnten, könnte dies das Problem anzeigen. Beispiel: Sehen Sie http://blogs.atlassian.com/2012/05/codecache-is-full-compiler-has-been-disabled/? – retronym

Antwort

7

Danke retronym für die CodeCache link. Ich habe es zunächst entlassen, da die Verwendung der vorgeschlagenen -XX:+UseCodeCacheFlushing Option keine Verbesserungen ergab, aber ich habe gerade versucht, -XX:ReservedCodeCacheSize=2g zu verwenden, und das hat das Problem gelöst.

Weiß jemand, warum -XX:+UseCodeCacheFlushing nicht hilft, oder einige empfohlene Werte für alle Code-Cache-Java-Optionen?

Für Spaß, hier ergeben sich meine Zeiten -XX:+HeapDumpOnOutOfMemoryError -server -XX:ReservedCodeCacheSize=2g -Xmx4g -Xss4M -XX:MaxPermSize=512M -XX:+DoEscapeAnalysis -XX:+UseCompressedOops -XX:+CMSClassUnloadingEnabled -XX:+UseCodeCacheFlushing mit kompilieren

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

Einstellung von '-XX: ReservedCodeCacheSize' auf 128m funktioniert genauso gut wie 2g – Mike

0

Sie können zunächst einen Profiler oder Monitor anschließen, um zu sehen, was mit GC passiert. Um eine erste Vorstellung davon zu bekommen, was los ist, sollte ein Stock Tool wie JVisualVM ausreichen. Natürlich, wenn Sie YourKit haben, würde das auch gut funktionieren.

Addenddum

Als milde interessant, aber jetzt weitgehend irrelevant beiseite, ich kürzlich entdeckt, dass Scala 2.9.0-1 atrociously langsam war, als Specs2 Tests (unveränderlich, zumindest) zu kompilieren. Die Umstellung auf 2.9.1 hat einen großen Unterschied gemacht. Ich habe es nur bemerkt, als ich einige Komponententests zu einem Projekt hinzufügen musste, das vorher keine hatte, und die Kompilierungszeiten wurden qualvoll. Nach einer Ahnung wechselte ich zu 2.9.1 und alles ging wieder normal.

+0

Ich schaute mit jvisualvm. Nichts scheint fischig zu sein mit GC (Heaps haben viel freien Platz, nicht viel Zeit für GC). CPU-Sampling zeigt mir auch nicht viel an (23% der Zeit in Object.hashCode, der Rest ist <5%). Der Speicherprofiler scheint nie damit fertig zu werden, Klassen neu zu definieren. Irgendeine Idee, wo man von hier aus sieht? – Mike

Verwandte Themen