Y a-t-il un avantage à mettre à niveau le code compilé Java 7 vers Java 8?

127

J'ai une ancienne application écrite en utilisant Java 7. Elle fonctionne bien dans un Java 8 JRE. Je ne prévois pas de réécrire le code pour utiliser les fonctionnalités de Java 8. Y a-t-il un avantage technique à mettre à niveau le code compilé vers le dernier JDK Java 8?

Pour être clair, le code est actuellement compilé avec Java 7 et déjà exécuté avec le dernier JRE Java 8. Il devrait déjà bénéficier des améliorations d'exécution de Java 8. Cette question est de savoir si des avantages seraient obtenus en compilant avec la version 8 et en exécutant avec le code d'octet compilé Java 8.


En outre, je ne suis pas préoccupé par les avantages non techniques tels que la productivité des développeurs. Je pense que ceux-ci sont importants, mais ce n'est pas le but de cette question. Je demande par souci de code de production qui n'a PAS d'équipe de développement. Il est purement en mode maintenance.

g8torPaul
la source
2
Juste pour être clair. Le code fonctionne déjà avec le dernier JRE 1.8 et a donc toutes les dernières corrections de bogues Java 8 et améliorations des performances d'exécution (à ma connaissance).
g8torPaul
4
C'est une question probablement plus à propos du bytecode émis par le compilateur. Peut-être que votre question est un peu plus claire.
M Platvoet
2
L'amélioration de la productivité des développeurs n'est donc pas pertinente ici?
Mick Mnemonic le
7
Comment «je ne prévois pas de réécrire le code» peut-il ne pas être clair, je ne peux pas le croire.
eldo
3
Cela peut être un peu lié: stackoverflow.com/questions/21732290/…
Arnaud

Réponses:

82

Si je comprends bien la question, vous voulez savoir si le bytecode produit par javacsera "meilleur" dans Java 8 que dans Java 7.

La réponse est probablement non, ils corrigent constamment des bogues dans le compilateur et cela conduit parfois à un bytecode plus efficace. Mais vous ne verrez aucune accélération significative de ces correctifs pour Java 8 pour autant que je sache , le journal des modifications ne répertorie que 2 changements majeurs entre les versions.

Le site Web d'Oracle est terrible et je n'arrive pas à obtenir une liste de corrections de bogues liées javacentre les versions, mais en voici une non exhaustive d'OpenJDK . La majorité de ceux que je parviens à trouver corrigent des erreurs. Donc, en mettant à jour vers Java 8, il y a une chance qu'il ne se compile plus en raison du javacsuivi plus correct du JLS et il y aura très peu ou pas d '"améliorations" au bytecode.

Andrew
la source
4
Merci, j'ai passé en revue une partie de la liste sur OpenJDK et rien ne se démarque vraiment sauf qu'il semble qu'ils aient amélioré les performances de javac. Je conviens qu'il est pratiquement impossible de faire une recherche raisonnable de correctifs / fonctionnalités entre les versions de Java sur le site Web d'Oracles. Le format des notes de publication de chaque version n'est même pas cohérent. Mon instinct me dit qu'il n'y a aucun avantage technique à compiler avec JDK 8 vs JDK 7.
g8torPaul
1
@ g8torPaul à moins que vous n'utilisiez des fonctionnalités uniquement disponibles dans Java 8, par exemple lamdbas / streams
Peter Lawrey
21

Le principal avantage est que Java 8 a les dernières corrections de bogues là où Java 7 n'est pas mis à jour publiquement.

De plus, si vous prévoyez d'exécuter du code sur une machine virtuelle Java 8, vous pouvez également n'avoir qu'une seule version de Java installée.

Java 8 est peut-être plus rapide et prend mieux en charge les nouvelles fonctionnalités telles que G1. Cependant, cela peut être plus lent pour votre cas d'utilisation, donc le seul moyen de le savoir est de le tester.

Y a-t-il un avantage technique à mettre à niveau le code compilé vers le dernier JDK Java 8?

Si vous demandez s'il y a un avantage à recompiler le code Java 7 dans un compilateur Java 8, la réponse est; presque rien.

La seule différence subtile est qu'il y a eu des différences mineures avec l'API Java, donc il peut y avoir des différences très subtiles que le compilateur Java 8 pourrait trouver que le Java 7

D'autres différences mineures sont le nombre magique au début du fichier, peut-être l'ordre du pool de constantes. Le code d'octet est fondamentalement le même, même le support pour invokedynamiclequel a été ajouté les lambdas existait dans Java 7 mais n'était tout simplement pas utilisé de cette façon.

Peter Lawrey
la source
8
Corrigez-moi si je me trompe, mais OP demande de recompiler le code avec Java 8, alors que votre réponse est de savoir s'il faut utiliser Java 8 pour l'exécuter?
tobias_k
5
J'utilise actuellement le dernier JRE Java 1.8. Tous les correctifs de bogues et le code Java interne seraient fournis par le JRE. Je ne pense pas que cela répond à ma question.
g8torPaul
16
Cela ne répond tout simplement pas à la question. Si ce n'est «presque rien», veuillez préciser quelle est la différence. Sinon, c'est juste de la spéculation
M Platvoet
1
@Peter Lawrey, vous dites que ".. la réponse est: presque rien". Avons-nous des preuves à l'appui? BTW, j'aurais tendance à être d'accord avec vous.
g8torPaul
2
@ g8torPaul Java 8 est conçu pour être rétrocompatible avec Java 7 et si vous n'utilisez aucune des fonctionnalités de Java 8, il devrait produire presque exactement le même code d'octet.
Peter Lawrey
21

Cela pourrait aider en créant une prise de conscience .

Lorsque vous passez à Java8, vous pouvez trouver des avertissements supplémentaires émis par javac. Exemple: l' inférence de type a été grandement améliorée avec Java8. Et cela pourrait éliminer le besoin d'annotations @SuppressWarnings dans votre base de code actuelle (et lorsque de telles annotations ne sont plus nécessaires, le compilateur en avertit).

Ainsi, même si vous n'avez pas l'intention de modifier votre base de code aujourd'hui, le passage à Java8 pourrait vous renseigner sur de telles choses. Augmenter vos connaissances peut vous aider à prendre des décisions éclairées.

D'autre part:

  • J'ai vu quelques questions ici sur les (rares) situations où Java8 a refusé de compiler du code Java7. Ainsi, passer à Java8 comporte également un risque (minime) de rencontrer ce genre de problème.
  • Et: même si vous n'avez pas l'intention de toucher votre base de code aujourd'hui , il y a une certaine chance que vous changiez d'avis plus tard. Et puis, si vous ne faites pas attention, vous pouvez exploiter les fonctionnalités de Java8. Ce qui pourrait compliquer les "mises à jour sur le terrain"; car vous avez maintenant deux versions de votre code source à maintenir!
  • Ensuite: au cas où vous auriez des clients exécutant le produit en utilisant un java7 jre; vous devez faire très attention aux correctifs binaires que vous leur donnez. Nous avons une telle configuration; et j'ai perdu du temps plus d'une fois parce que j'ai accidentellement mis une seule classe compilée en Java8 sur un système de test piloté par Java7. Cela ne peut tout simplement pas se produire lorsque votre configuration de développement et de test / client est entièrement Java7.

En bref: il y a quelques avantages subtils et certains risques (où l'importance des risques dépend principalement de votre configuration globale).

GhostCat
la source
2
Un exemple d'un tel problème rare "Java8 a refusé de compiler Java7": stackoverflow.com/q/41590024/2513200 (un problème connu du compilateur Oracle n'affectant que Java 8, mais ni 7 ni 9)
Hulk
8

Je ferais au moins pour ces faits.

1) Internals HashMap (c'est plus rapide sous jdk-8)

2) Beaucoup de bogues corrigés qui pourraient être transparents pour vous (optimisations d'exécution) qui rendront votre code plus rapide et meilleur sans que vous fassiez quoi que ce soit.

3) Garbage Collector G1

ÉDITER

D'un point de vue technique, cela ressemble plus à quelque chose à voir avec Ahead of Time Compilation ou à quelque chose qu'un compilateur pourrait améliorer en analysant davantage le code. Autant que je sache, de telles choses ne sont pas faites dans le compilateur java 8.

Du point de vue du développeur, il y en a beaucoup. L'augmentation de la productivité est la plus importante pour moi.

MODIFIER 2

Je ne connais que deux points qui correspondent à votre deuxième requête:

-paramètres

pour conserver les noms des paramètres de méthode.

-profil

Appelé Option de profil compact pour un encombrement réduit.

Eugène
la source
26
Est-ce que le simple fonctionnement sous Java 8 ne donnerait pas déjà ces avantages? La vraie question semble être: "Puis-je écrire quelque chose en Java 8 qui fonctionne mieux que l'équivalent Java 7".
Jorn Vernee
8
J'utilise actuellement le dernier JRE Java 1.8. Tous les correctifs de bogues et le code Java interne seraient fournis par le JRE. Le garbage collector fait également partie du JRE. Je ne pense pas que cela répond à ma question.
g8torPaul
8
@JornVernee OPs a explicitement dit qu'il ne voulait rien réécrire, donc la question, si je comprends bien, est plutôt "le compilateur Java 8 peut-il faire des trucs que le compilateur Java 7 ne peut pas faire"
tobias_k
2
@JornVernee La question est, si le code écrit en Java 7 et compilé en Java 8 s'exécute mieux que le code compilé en Java 7
EarlGrey
6
Ne répond pas à la question et spécule simplement qu'il ne s'est pas amélioré.
M Platvoet le
-1

Si vous n'avez pas d'autres raisons de recompiler votre application, cela ne fait probablement pas beaucoup de différence, comme indiqué dans la réponse acceptée.

Cependant, si vous devez le recompiler ne serait-ce qu'une seule fois, considérez ceci:

  • Le code source de votre application est compatible avec Java 7, et probablement 8 aussi;
  • Dans l'éventualité où le code ne se compile pas avec Java 8, il ne se compilera probablement pas non plus avec un compilateur Java 8 en mode de compatibilité source Java 7 ( -source 7avec javac);
  • Vos développeurs et CI devront exécuter des tests unitaires et d'intégration sur un environnement d'exécution Java 8 pour être aussi proche que possible de l'environnement de production. Les développeurs devront également exécuter l'application sur le même environnement d'exécution Java 8 lorsqu'ils l'exécutent localement;
  • Il est plus difficile de compiler avec un JDK 7 et de l'exécuter avec un JRE 8 (dans le même processus de construction, ou dans le même IDE) que de tout faire avec la même version;
  • Il n'y a aucun avantage à utiliser -source 7au lieu de -source 8si vous compilez avec un JDK 8 et que votre environnement d'exécution cible est Java 8;
  • L'utilisation -source 8garantit que le développeur utilise Java 8 (ou version ultérieure) à la fois pour la compilation et pour l'exécution (tel qu'il s'applique -target 8).

En conclusion, ne le recompilez pas si vous n'en avez pas besoin. Cependant, la première fois, vous devez recompiler (en raison de changements de code), passer à Java 8. Ne prenez pas le risque d'avoir un bogue dû à des inadéquations d'environnement, et ne restreignez pas les développeurs sans une bonne raison.

Didier L
la source
Le deuxième point n'est pas correct. Votre message est contradictoire sur plusieurs points.
Marquis of Lorne
@EJP Le deuxième point est plus de mon expérience, mais avez-vous un exemple qui compile en JDK 8 avec -source 7mais ne compile pas avec -source 8? Aussi, pourriez-vous s'il vous plaît indiquer les contradictions car votre commentaire n'est pas très constructif en tant que tel…
Didier L