2015-02-13 2 views
14

Meine Anwendung lädt eine Reihe von Audioclips beim Start. Es verwendet java.applet.Applet.newAudioClip(URL audioFileURL), um die Dateien zu laden, die sich im selben Ordner befinden. Ich konnte sehen, dass diese Funktion im Grunde ein Wrapper JavaSoundAudioClip ObjekteJava Sound dramatisch langsamer nach JVM 8 Update

Bis gestern zu bekommen, ist, ich die JAR mit JDK 7 zusammengestellt und startete es mit JRE-Version 7 Update 45. Dann habe ich 31
nun auf Version 8 Update aktualisiert Das Laden jedes Audios dauert zehn Mal länger als zuvor (war jeweils 0,2 Sekunden, jetzt liegt es zwischen 2 und 3 Sekunden).
Das gleiche Verhalten ist bei verschiedenen Hardwarekonfigurationen aufgetreten. OS ist 64bit Windows 7, sowohl Java 7 als auch 8 Laufzeitumgebungen sind 32bit.

tiefer in das Debuggen Graben, fand ich, dass die Methoden, die am meisten verlangsamt sind AudioSystem.getAudioInputStream, AudioSystem.isLineSupported, AudioSystem.getLine

Audioformat nicht einbezogen werden sollten: Ich habe versucht, sowohl OGG und WAV mit den gleichen Ergebnissen.

Die Einstellungen für beide JVMs sind die gleichen

EDIT: Auch ich konnte das Problem in einem kleinen Programm aus Ad-hoc nicht reproduzieren. Java 8 ist in der Tat langsamer, aber nur mit einem Faktor von 10%. Es muss etwas speziell mit meiner Anwendung geben und die Bibliotheken, die ich verwende, die mit Audiosystem und/oder seinen Strömen in Konflikt stehen. Ich werde aktualisieren, sobald ich es herausfinden werde.

+0

Konnte man die Leistung dieser Methodenaufrufe zwischen den jdk 7 und 8 vergleichen: 'JDK13Services.getProviders (AudioFileReader.class); JDK13Services.getProviders (MixerProvider.class); JDK13Services.getProviders (AudioFileReader.class); ' – gontard

+2

Sprechen wir Oracle JDK oder für die OpenJDK? –

+0

Haben Sie einen Testfall, der das Problem zeigt? Ich konnte es nicht reproduzieren. – apangin

Antwort

6

Schließlich habe ich herausgefunden, was das Problem verursacht hat. Ich habe jar-in-jar-loader verwendet (soweit ich weiß, entspricht es der Eclipse-Option "Package required libraries in generated JAR"), um Bibliotheks-Jars in meine Anwendung einzubinden. Bis jetzt hatte dies keinen merklichen Einfluss auf die Performance.
Aber mit Java 8 erlebe ich diese enorme Verlangsamung.Überwachung der Anwendung mit jconsole Ich habe festgestellt, dass es oft blockiert warte, während ich auf zip deflate-Operationen warte. Also muss sich etwas in JRE Version 8 geändert haben, das nun weniger für jars in jars optimiert ist.

Ich löste die Auswahl zu extrahieren alle Bibliothek Gläser und dann packen sie in meiner Anwendung jar.

+0

Vielen Dank für den Austausch mit uns und es ist ein interessantes Ergebnis. Dazwischen bevorzuge ich maven-shade-plugin, es entpackt alle Klassen in ein einziges Glas. –

3

Java 8 führt einige neue Techniken von Garbage Collectors ein. Da Sie Daten/Objekte in die VM laden, werden sie möglicherweise dazu veranlasst, gleichzeitige Sweeps und parallele Komprimierung durchzuführen. Wir empfehlen Ihnen, die JVM GC-Parameter einzustellen.

-XX: ConcGCThreads = n Anzahl der Threads, die gleichzeitige Garbage Collectors verwenden. Der Standardwert variiert mit der Plattform, auf der die JVM ausgeführt wird.

-XX: InitiatingHeapOccupancyPercent = n Prozentsatz der (gesamten) Heapbelegung zum Starten eines gleichzeitigen GC-Zyklus. Es wird von GCs verwendet, die einen konkurrierenden GC-Zyklus basierend auf der Belegung des gesamten Heaps auslösen, nicht nur einer der Generationen (z. B. G1). Ein Wert von 0 bedeutet "mache konstante GC-Zyklen". Der Standardwert ist 45.

-XX: ParallelGCThreads = n Legt die Anzahl der Threads fest, die in parallelen Phasen der Garbage Collectors verwendet werden. Der Standardwert variiert mit der Plattform, auf der die JVM ausgeführt wird. -XX: ConcGCThreads = n Anzahl der Threads, die gleichzeitige Garbage Collectors verwenden. Der Standardwert variiert mit der Plattform, auf der die JVM ausgeführt wird.

http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

Bitte, lassen Sie mich wissen, ob GC-Tuning geholfen, ich bin Ihr Szenario zu replizieren nicht in der Lage, aber es wäre eine interessante Tatsache sein, zu erfahren, was es verursacht wurde!

+0

Ich habe versucht, etwas auf GC zu tunen, habe aber keine Verbesserung bemerkt. Ich werde aktualisieren, sobald ich die Ursache (und ich mache es besser schnell, weil Java 7 im April eingestellt wird) – Giuseppe