Gibt es einen Vorteil beim Upgrade von Java 7-kompiliertem Code auf Java 8?

127

Ich habe eine alte Anwendung mit Java 7 geschrieben. Sie läuft gut in einer Java 8 JRE. Ich habe nicht vor, den Code neu zu schreiben, um die Java 8-Funktionen nutzen zu können. Gibt es einen technischen Vorteil beim Upgrade des kompilierten Codes auf das neueste Java 8 JDK?

Der Code wird derzeit mit Java 7 kompiliert und läuft bereits mit der neuesten Java 8 JRE. Es sollte bereits von den Java 8-Laufzeitverbesserungen profitieren. Diese Frage ist, ob die Kompilierung mit Version 8 und die Ausführung mit Java 8-kompiliertem Bytecode Vorteile bringen würden.


Ich beschäftige mich auch nicht mit nicht-technischen Vorteilen wie der Entwicklerproduktivität. Ich denke, das ist wichtig, aber nicht der Punkt dieser Frage. Ich bitte um Produktionscode, der KEIN Entwicklungsteam hat. Es befindet sich ausschließlich im Wartungsmodus.

g8torPaul
quelle
2
Nur um das klar zu stellen. Der Code läuft bereits mit der neuesten Version 1.8 JRE und verfügt daher (meines Wissens) über die neuesten Java 8-Fehlerkorrekturen und Verbesserungen der Laufzeitleistung.
g8torPaul
4
Dies ist wahrscheinlich eine Frage mehr zum Bytecode, der vom Compiler ausgegeben wird. Vielleicht machen Sie das in Ihrer Frage etwas klarer.
M Platvoet
2
Eine verbesserte Entwicklerproduktivität ist hier also nicht relevant?
Mick Mnemonic
7
Wie kann "Ich habe nicht vor, den Code neu zu schreiben" nicht klar sein, ich kann es nicht glauben.
Eldo
3
Dies kann etwas verwandt sein: stackoverflow.com/questions/21732290/…
Arnaud

Antworten:

82

Wenn ich die Frage richtig verstehe, möchten Sie wissen, ob der von erzeugte Bytecode javacin Java 8 "besser" ist als in Java 7.

Die Antwort ist wahrscheinlich nicht, sie beheben ständig Fehler im Compiler und das führt manchmal zu einem effizienteren Bytecode. Soweit ich sehen kann, werden diese Korrekturen für Java 8 keine signifikante Beschleunigung feststellen. Im Änderungsprotokoll sind nur zwei wichtige Änderungen zwischen den Versionen aufgeführt.

Die Oracle-Website ist schrecklich und ich kann anscheinend keine Liste der Bugfixes javaczwischen den Versionen erhalten, aber hier ist eine nicht erschöpfende von OpenJDK . Ein Großteil der Fehler, die ich finden kann, behebt Fehler. Wenn Sie also auf Java 8 aktualisieren, besteht die Möglichkeit, dass es nicht mehr kompiliert wird, da es javacdem JLS korrekter folgt, und der Bytecode wird kaum oder gar nicht "verbessert".

Andrew
quelle
4
Vielen Dank, ich habe einige der Listen auf OpenJDK überprüft und nichts ist wirklich bemerkenswert, außer dass es den Anschein hat, als hätten sie die Leistung von Javac verbessert. Ich bin damit einverstanden, dass es nahezu unmöglich ist, eine vernünftige Suche nach Korrekturen / Funktionen zwischen Java-Versionen auf der Oracles-Website durchzuführen. Das Format der Versionshinweise für jede Version ist nicht einmal konsistent. Mein Bauch sagt mir, dass das Kompilieren mit JDK 8 gegen JDK 7 keinen technischen Vorteil hat.
g8torPaul
1
@ g8torPaul, es sei denn, Sie werden Funktionen verwenden, die nur in Java 8 verfügbar sind, z. B. Lamdbas / Streams
Peter Lawrey
21

Der Hauptvorteil ist, dass Java 8 die neuesten Fehlerkorrekturen enthält, bei denen Java 7 nicht öffentlich aktualisiert wird.

Wenn Sie Code auf einer Java 8-JVM ausführen möchten, ist möglicherweise auch nur eine Java-Version installiert.

Java 8 ist möglicherweise schneller und unterstützt neue Funktionen wie G1 besser. Es kann jedoch für Ihren Anwendungsfall langsamer sein, sodass Sie es nur testen können.

Gibt es einen technischen Vorteil beim Upgrade des kompilierten Codes auf das neueste Java 8 JDK?

Wenn Sie sich fragen, ob das Neukompilieren von Java 7-Code in einem Java 8-Compiler von Vorteil ist, lautet die Antwort: fast nichts.

Der einzige subtile Unterschied besteht darin, dass es geringfügige Unterschiede zur Java-API gab, sodass der Java 8-Compiler möglicherweise sehr geringfügige Unterschiede zu Java 7 aufweist

Andere kleine Unterschiede sind die magische Zahl am Anfang der Datei, möglicherweise die Reihenfolge des konstanten Pools. Der Bytecode ist im Grunde der gleiche, sogar die Unterstützung, invokedynamicdie für Lambdas hinzugefügt wurde, existierte in Java 7, wurde aber einfach nicht so verwendet.

Peter Lawrey
quelle
8
Korrigieren Sie mich, wenn ich falsch liege, aber OP fragt nach einer Neukompilierung des Codes mit Java 8, während Ihre Antwort lautet, ob Sie Java 8 zum Ausführen verwenden sollen.
tobias_k
5
Ich arbeite derzeit unter der neuesten Java 1.8 JRE. Alle Fehlerkorrekturen und der interne Java-Code werden von der JRE bereitgestellt. Ich glaube nicht, dass dies meine Frage anspricht.
g8torPaul
16
Dies beantwortet die Frage einfach nicht. Wenn es "fast nichts" ist, klären Sie bitte, was der Unterschied ist. Ansonsten spekuliert es nur
M Platvoet
1
@ Peter Lawrey, Sie sagen, dass ".. die Antwort ist; fast nichts". Haben wir Beweise dafür? Übrigens würde ich Ihnen eher zustimmen.
g8torPaul
2
@ g8torPaul Java 8 ist abwärtskompatibel mit Java 7 und wenn Sie keine der Funktionen von Java 8 verwenden, sollte es fast genau den gleichen Bytecode erzeugen.
Peter Lawrey
21

Es könnte helfen, indem es Bewusstsein schafft .

Wenn Sie zu Java8 wechseln, werden möglicherweise zusätzliche Warnungen von javac ausgegeben. Beispiel: Die Typinferenz wurde mit Java8 erheblich verbessert. Dadurch könnte die Notwendigkeit von @ SuppressWarnings-Annotationen in Ihrer aktuellen Codebasis entfallen (und wenn solche Annotationen nicht mehr benötigt werden, warnt der Compiler davor).

Selbst wenn Sie heute nicht beabsichtigen, Ihre Codebasis zu ändern, kann ein Wechsel zu Java8 Sie über solche Dinge informieren. Wenn Sie Ihr Wissen erweitern, können Sie fundierte Entscheidungen treffen.

Andererseits:

  • Ich habe hier einige Fragen zu (seltenen) Situationen gesehen, in denen Java8 sich weigerte, Java7-Code zu kompilieren. Der Wechsel zu Java8 birgt also auch ein (minimales) Risiko, auf solche Probleme zu stoßen.
  • Und: Auch wenn Sie nicht vorhaben , Ihre Codebasis berühren heute , gibt es eine gewisse Chance , dass Sie Ihre Meinung zu einem späteren Zeitpunkt ändern. Und wenn Sie nicht darauf achten, können Sie die Java8-Funktionen nutzen. Was "Feldaktualisierungen" erschweren könnte ; Sie müssen jetzt zwei Versionen Ihres Quellcodes pflegen!
  • Dann: falls Kunden das Produkt mit einem java7 jre ausführen; Sie müssen sehr vorsichtig mit den binären Korrekturen sein, die Sie ihnen geben. Wir haben so ein Setup; und ich habe mehr als einmal Zeit verschwendet, weil ich versehentlich eine einzelne Java8-kompilierte Klasse auf ein Java7-gesteuertes Testsystem gestellt habe. Das kann einfach nicht passieren, wenn Ihr Entwickler- und Test- / Kunden-Setup ausschließlich Java7 ist.

Lange Rede, kurzer Sinn: Es gibt einige subtile Vorteile und bestimmte Risiken (wobei die Bedeutung der Risiken hauptsächlich von Ihrer Gesamtkonfiguration abhängt).

GhostCat
quelle
2
Ein Beispiel für ein so seltenes Problem "Java8 hat sich geweigert, Java7 zu kompilieren": stackoverflow.com/q/41590024/2513200 (ein bekanntes Problem des Oracle Compilers, das nur Java 8 betrifft, aber weder 7 noch 9)
Hulk
8

Ich würde zumindest für diese Tatsachen tun .

1) HashMap-Interna (unter jdk-8 ist es schneller)

2) Viele Fehler wurden behoben, die für Sie möglicherweise transparent sind (Laufzeitoptimierungen), wodurch Ihr Code schneller und besser wird, ohne dass Sie tatsächlich etwas tun.

3) G1 Garbage Collector

BEARBEITEN

Aus technischer Sicht klingt dies eher nach etwas, das mit Ahead of Time Compilation zu tun hat, oder nach etwas, das ein Compiler verbessern könnte, wenn er den Code genauer analysiert. Soweit ich weiß, werden solche Dinge im Java 8-Compiler nicht ausgeführt.

Aus Entwicklersicht gibt es viele. Eine gesteigerte Produktivität ist für mich das Wichtigste.

BEARBEITEN 2

Ich kenne nur zwei Punkte, die Ihrer zweiten Anfrage entsprechen:

–Parameter

um die Namen der Methodenparameter beizubehalten.

-Profil

Wird als kompakte Profiloption für eine geringere Stellfläche bezeichnet.

Eugene
quelle
26
Würde das Ausführen unter Java 8 diese Vorteile nicht bereits bieten? Die eigentliche Frage scheint zu sein: "Kann ich etwas in Java 8 schreiben, das besser funktioniert als das Java 7-Äquivalent?"
Jorn Vernee
8
Ich arbeite derzeit unter der neuesten Java 1.8 JRE. Alle Fehlerkorrekturen und der interne Java-Code werden von der JRE bereitgestellt. Der Garbage Collector ist ebenfalls Teil der JRE. Ich glaube nicht, dass dies meine Frage anspricht.
g8torPaul
8
@JornVernee OPs sagten ausdrücklich, dass er nichts umschreiben möchte, daher lautet die Frage meines Wissens eher "Kann der Java 8-Compiler irgendwelche Tricks
ausführen,
2
@JornVernee Die Frage ist, ob in Java 7 geschriebener und in Java 8 kompilierter Code besser ausgeführt wird als der in Java 7 kompilierte Code
EarlGrey
6
Beantwortet die Frage nicht und spekuliert lediglich, dass sie sich nicht verbessert hat.
M Platvoet
-1

Wenn Sie keine anderen Gründe haben, Ihre Bewerbung neu zu kompilieren, macht dies wahrscheinlich keinen großen Unterschied, wie in der akzeptierten Antwort angegeben.

Wenn Sie es jedoch nur einmal neu kompilieren müssen, beachten Sie Folgendes:

  • Ihr Anwendungsquellcode ist mit Java 7 und höchstwahrscheinlich auch mit 8 kompatibel.
  • Für den Fall, dass der Code nicht mit Java 8 kompiliert wird, wird er wahrscheinlich auch nicht mit einem Java 8-Compiler im Java 7-Quellkompatibilitätsmodus ( -source 7mit Javac) kompiliert .
  • Ihre Entwickler und CI müssen Unit- und Integrationstests für eine Java 8-Laufzeit ausführen, um so nah wie möglich an der Produktionsumgebung zu sein. Entwickler müssen die Anwendung auch auf derselben Java 8-Laufzeit ausführen, wenn sie lokal ausgeführt wird.
  • Es ist schwieriger, mit einem JDK 7 zu kompilieren und mit einem JRE 8 (im selben Erstellungsprozess oder in derselben IDE) auszuführen, als alles mit derselben Version zu tun.
  • Es gibt keinen Vorteil bei der Verwendung -source 7statt , -source 8wenn Sie kompilieren mit einem JDK 8 und Ziellaufzeit ist Java 8;
  • Die Verwendung -source 8garantiert, dass der Entwickler Java 8 (oder höher) sowohl für die Kompilierung als auch für die Laufzeit verwendet (wie erzwungen -target 8).

Fazit: Kompilieren Sie es nicht neu, wenn Sie es nicht müssen. Beim ersten Mal müssen Sie jedoch neu kompilieren (aufgrund von Codeänderungen), zu Java 8 wechseln. Gehen Sie nicht das Risiko eines Fehlers aufgrund von Umgebungsinkongruenzen ein und schränken Sie die Entwickler nicht ohne guten Grund ein.

Didier L.
quelle
Der zweite Aufzählungspunkt ist nicht korrekt. Ihr Beitrag ist an mehreren Stellen widersprüchlich.
Marquis von Lorne
@EJP Der zweite Aufzählungspunkt ist eher meine Erfahrung, aber haben Sie ein Beispiel, mit dem in JDK 8 -source 7kompiliert wird, mit dem jedoch nicht kompiliert wird -source 8? Könnten Sie bitte auch die Widersprüche angeben, da Ihr Kommentar als solcher nicht sehr konstruktiv ist…
Didier L