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.
quelle
Antworten:
Wenn ich die Frage richtig verstehe, möchten Sie wissen, ob der von erzeugte Bytecode
javac
in 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
javac
zwischen 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 esjavac
dem JLS korrekter folgt, und der Bytecode wird kaum oder gar nicht "verbessert".quelle
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.
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,
invokedynamic
die für Lambdas hinzugefügt wurde, existierte in Java 7, wurde aber einfach nicht so verwendet.quelle
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:
Lange Rede, kurzer Sinn: Es gibt einige subtile Vorteile und bestimmte Risiken (wobei die Bedeutung der Risiken hauptsächlich von Ihrer Gesamtkonfiguration abhängt).
quelle
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:
um die Namen der Methodenparameter beizubehalten.
Wird als kompakte Profiloption für eine geringere Stellfläche bezeichnet.
quelle
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:
-source 7
mit Javac) kompiliert .-source 7
statt ,-source 8
wenn Sie kompilieren mit einem JDK 8 und Ziellaufzeit ist Java 8;-source 8
garantiert, 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.
quelle
-source 7
kompiliert 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…