2016-04-13 9 views
2

Ich entwickle eine Java 8 SE-Anwendung in Netbeans. Ein neues Feature, das ich kürzlich der App hinzugefügt habe, lief zu langsam (ungefähr eine Minute, bis die Berechnungen gestoppt wurden). Also habe ich den Profiler angezündet, um zu sehen, was der größte Engpass ist. Zu meiner Überraschung wurden die Berechnungen in etwa 7 Sekunden abgeschlossen.Warum läuft meine Java App schneller mit angehängtem Profiler?

Ich konnte es zuerst nicht glauben, aber die Ergebnisse waren korrekt. Ich habe es ein paar Mal versucht, aber die App lief immer 10-mal schneller mit dem Profiler, der daran angeschlossen war. Ich habe auch versucht, die kompilierte .jar-Datei direkt von der Windows-Befehlszeile auszuführen, aber die Berechnungen haben immer wieder etwa eine Minute gedauert.

Wie ist es möglich, dass der angeschlossene Profiler die Leistung so massiv steigert? Was ändert sich an der JVM oder der Anwendung?

BTW, ich benutze native OpenCV in diesen Berechnungen mit bereitgestellten Java-Wrapper, wenn es einen Unterschied macht.

// Bearbeiten - Zusätzliche Informationen: Ich benutze den integrierten Netbeans 8.1 Profiler, der im Grunde genommen VisualVM ist. Wie bei einer Profilierungsmethode habe ich mich entschieden, "Methoden" und deren Ausführungszeiten und Aufrufzahlen zu überwachen. Der Performance-Stoß tritt sowohl bei instrumentierten als auch bei abgetasteten Profilen auf.

+0

Ich denke, Ihre Frage könnte besser von "Warum ist die Profiler Umgebung schneller "zu" warum ist die Nicht-Profiler-Umgebung langsamer ". – brycem

+0

Welchen Profiler benutzen Sie? 'Was ändert sich mit der JVM oder der Anwendung?' Kann nur beantwortet werden, wenn Sie diese Informationen angeben, da es verschiedene Profiling-Techniken (Sampling, Instrumentierung, ...) gibt;) –

+0

@Markus Weninger Ich habe den Beitrag mit einigen Informationen aktualisiert – Leprechaun

Antwort

0

Leider gibt es wahrscheinlich keine einzige Antwort, die erklären wird, warum dies der Fall ist. Natürlich hängt es davon ab, was das Programm tut und wie das Programm gestartet wird. Wenn Sie beispielsweise den Profiler verwenden, um die Anwendung zu starten (im Gegensatz zur anschließenden Verbindung), wird der Profiler möglicherweise mit einer anderen Konfiguration gestartet (Heap-Größe, Garbage Collector usw.), und das ist der Grund für den Unterschied .

Wenn Sie jcmd ausführen, sollten Sie eine Liste der Prozesse sehen. Sie können dann jcmd <id> VM.flags ausführen, um zu sehen, wofür die JVM konfiguriert wurde, und sicherstellen, dass die gleichen für die Anwendung unter einem Profiler gelten und wenn dies nicht der Fall ist.

Eine andere Möglichkeit ist, dass Ihr Programm übermäßig gesperrt ist, und diese übermäßige Sperre verursacht in Ihrer Anwendung einen Schlag, wenn der Profiler nicht angeschlossen ist. Wenn es angebracht ist, kann die Verriegelung langsamer sein, was dazu führt, dass die Anwendungsfäden zusammenwirken und letztendlich einen schnelleren Fortschritt machen.

Dies sind jedoch nur Vorschläge, wie Sie weiter untersuchen können; es ist ziemlich wahrscheinlich, dass es ein anderes, noch unentdecktes Problem gibt, das Sie sehen, das völlig anders ist (z. B. ist es auf einem anderen Protokollierungsniveau voreingestellt ...)

Verwandte Themen