Java-Anwendung CPU / laden viel höher, wenn sie gegen JDK8 gebaut wird

8

Ich habe eine Java-Anwendung in Eclipse Luna in Windows entwickelt, die in Amazon EC2 läuft (c3.large, Amazon Linux). Diese Anwendungsprozesse arbeiten mit einer sehr konstanten Eingangsrate. Wenn ich die Anwendung gegen JDK 8u31 erstelle, ist die EC2-CPU-Last viel höher als die gleiche Anwendung, die gegen JDK 7u75 gebaut wird.

Die Anwendung lief ursprünglich mit der Standard-JRE auf EC2, und ich habe die OpenJDK 1.8.0.31 hinzugefügt, um die Vorteile von Java 8 Process waitFor (langes Timeout, TimeUnit-Einheit) zu nutzen. Die Hauptaufgabe dieser Anwendung besteht darin, eine Anwendung mit Runtime.exec aufzurufen.

%Vor%

Beispiel last Durchschnitt, wenn die Anwendung gegen 1.7 erstellt wird:

%Vor%

Beispiellademittelwert, wenn die Anwendung gegen 1.8:

erstellt wird %Vor%

Es scheint so, als ob es mit dem Open JDK 1.8.0.31 zusammenhängen könnte, aber ich weiß nicht, wie ich das debuggen soll. Es gibt keine Codeänderungen, ich ändere lediglich die Compliance-Stufe und baue zwischen 1,7 und 1,8 in Eclipse Luna. Irgendeine Idee, warum die Ladung so viel anders wäre?

UPDATE:

Ich sehe eine ähnlich hohe CPU-Auslastung, wenn ich das Oracle JDK auf EC2 verwende.

%Vor%

Lade Durchschnitt:

%Vor%     
DanielB6 22.02.2015, 00:25
quelle

2 Antworten

3

Sie haben Symptome beschrieben, aber ich denke nicht, dass dies ausreicht, um weiterzumachen, allein schon deshalb, weil es unmöglich ist, irgendwo nach "Java 8 high CPU" zu suchen (Google, die Java Bugparade, etc .) und finde nützliche Ergebnisse. Leider müssen Sie mehr Informationen darüber sammeln, was mit der CPU arbeitet. Hier sind einige Gedanken dazu:

  1. Profil mit einem Tool wie VisualVM. Die Lastunterschiede sind extrem, so dass Sie möglicherweise nur feststellen können, was mit der CPU arbeitet.
  2. Finde die aktiven Threads. Sie können eine Reihe von Thread-Snapshots aufnehmen und sie mit einem Augapfel versehen oder ein Tool wie jvmtop ausprobieren.
  3. Überprüfen Sie, was der Garbage Collector gerade macht, entweder indem Sie die GC-Protokollierung aktivieren oder mit einem Tool wie jstat.
  4. Benutze strace um die Ausführung von Systemaufrufen zu verfolgen.
jtoberon 05.03.2015 03:11
quelle
1

Die Dokumentation besagt: "Die Standardimplementierung dieser Methoden fragt exitValue ab, um zu überprüfen, ob der Prozess beendet wurde. Konkrete Implementierungen dieser Klasse werden dringend empfohlen, diese Methode mit einer effizienteren Implementierung zu überschreiben."

Ich vermute stark, dass dies der Grund ist.

Siehe Ссылка

    
Gerhard Wesp 01.03.2015 22:04
quelle

Tags und Links