2015-02-13 9 views
14

Moja aplikacja ładuje pęk klipów audio podczas uruchamiania. Używa ona java.applet.Applet.newAudioClip(URL audioFileURL) do załadowania plików, które znajdują się w tym samym folderze. Widziałam, że ta funkcja jest zasadniczo otoki uzyskać JavaSoundAudioClip obiektówDźwięk Java dramatycznie wolniej po aktualizacji JVM 8

Do wczoraj, Skompilowałem JAR z JDK 7 i uruchomił go z JRE wersji 7 uaktualnienia 45. Potem zaktualizowany do wersji 8 Update 31.
teraz ładowanie każdego dźwięku trwa dziesięć razy dłużej niż poprzednio (po 0,2 sekundy każdy, teraz wynosi od 2 do 3 sekund).
To samo zachowanie miało miejsce w różnych konfiguracjach sprzętowych. System operacyjny to 64-bitowy system Windows 7, a środowiska wykonawcze Java 7 i 8 to 32-bitowe.

Kopiąc głębiej w debugowania, stwierdziliśmy, że metody, które spowolniły większości są AudioSystem.getAudioInputStream, AudioSystem.isLineSupported, AudioSystem.getLine

Format audio nie powinny być zaangażowane: Próbowałem zarówno OGG i WAV z tych samych wyników.

Ustawienia dla obu JVMs są takie same

EDIT: jeszcze nie mogę odtworzyć problem w niewielki program złożony ad-hoc. Java 8 jest wolniejsza, ale tylko z 10% współczynnikiem. Musi być coś szczególnego w mojej aplikacji i bibliotekach, których używam, które są w konflikcie z systemem audio i/lub jego strumieniami. Będę aktualizował, jak tylko się dowiem.

+0

Czy można porównać wydajność tej metody wywołania między jdk 7 i 8: 'JDK13Services.getProviders (AudioFileReader.class); JDK13Services.getProviders (MixerProvider.class); JDK13Services.getProviders (AudioFileReader.class); ' – gontard

+2

Czy mówimy o Oracle JDK lub o OpenJDK? –

+0

Czy masz przypadek testowy demonstrujący problem? Nie mogłem tego odtworzyć. – apangin

Odpowiedz

6

W końcu dowiedziałem się, co było przyczyną problemu. Użyłem programu jar-in-jar-loader (o ile wiem, jest to odpowiednik opcji Eclipse "Pakowanie wymaganych bibliotek do wygenerowanego pliku JAR") w celu włączenia słoików do biblioteki w mojej aplikacji. Do tej pory nie miało to żadnego zauważalnego wpływu na wydajność.
Ale z Java 8 odczuwam to ogromne spowolnienie.Monitorowanie aplikacji za pomocą jconsole Zauważyłem, że często było blokowane oczekiwanie na operacje deflate zip, więc coś musiało się zmienić w wersji JRE 8, która jest teraz mniej zoptymalizowana dla słoików wewnątrz słoików.

Postanowiłem wyodrębnić wszystkie słoiki z biblioteki, a następnie zapakować je w słoik aplikacji.

+0

Dziękujemy za podzielenie się z nami i to interesujące odkrycie. Między wolę maven-shade-plugin, rozpakowuje wszystkie klasy w jednym słoiku. –

3

Java 8 wprowadza nowe techniki usuwania śmieci. Ponieważ ładujesz dane/obiekty do maszyny wirtualnej, mogą zostać uruchomione, aby wykonywać równoczesne przeciągnięcia i zagęszczanie równoległe. Zaleca się dostrojenie parametrów JVM GC.

-XX: ConcGCThreads = n Liczba wątków współbieżnych garbage collectors będzie używana. Domyślna wartość zależy od platformy, na której działa JVM.

-XX: InitiatingHeapOccupancyPercent = n Procent zajętości (całkowitej) sterty do rozpoczęcia współbieżnego cyklu GC. Jest używany przez GC, które wyzwalają równoczesny cykl GC w oparciu o obłożenie całej sterty, a nie tylko jedną z generacji (np. G1). Wartość 0 oznacza "wykonaj stałe cykle GC". Domyślna wartość to 45.

-XX: ParallelGCThreads = n Ustawia liczbę wątków używanych podczas równoległych faz śmieciarek. Domyślna wartość zależy od platformy, na której działa JVM. -XX: ConcGCThreads = n Liczba wątków współbieżnych garbage collectors będzie używana. Domyślna wartość zależy od platformy, na której działa JVM.

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

uprzejmie, daj mi znać, jeśli GC strojenie pomógł, nie jestem w stanie replikować swój scenariusz, ale byłby to interesujący fakt, aby dowiedzieć się, co było przyczyną go!

+0

Próbowałem trochę dostroić GC, ale nie zauważyłem żadnego wzmocnienia. Będę aktualizował, jak tylko odkryję przyczynę (i lepiej zrobię to szybko, bo Java 7 zostanie przerwana w kwietniu) – Giuseppe