web-dev-qa-db-fra.com

La mise à niveau de Java 7 code compilé vers Java 8?

J'ai une ancienne application écrite avec Java 7. Elle fonctionne correctement dans un JRE Java 8. Je ne prévois pas de réécrire le code pour l'utiliser] of Java 8 fonctionnalités. Existe-t-il un avantage technique à la mise à niveau du code compilé avec le dernier Java 8 JDK?

Pour être clair, le code est actuellement compilé avec Java 7 et s'exécute déjà avec le dernier Java 8 JRE. Il devrait déjà bénéficier de Java 8. Cette question est de savoir s'il serait avantageux de compiler avec la version 8 et de l'exécuter avec du code Java 8 octets compilés.


De plus, je ne m'intéresse pas aux avantages non techniques tels que la productivité des développeurs. Je pense que ceux-ci sont importants mais pas le point de cette question. Je demande pour le code de production qui n'a AUCUNE équipe de développement. C'est purement en mode maintenance.

126
g8torPaul

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

La réponse est probablement non, ils corrigent constamment des bugs dans le compilateur, ce qui conduit parfois à un bytecode plus efficace. Mais vous ne verrez aucune accélération significative de ces corrections pour Java 8 à ce que je sache, le changelog ne répertorie que 2 modifications majeures entre les versions.

Le site Web Oracle est terrible et je n'arrive pas à obtenir une liste de corrections de bogues liées à javac entre versions, mais voici une version non exhaustive de OpenJDK . Une majorité de celles que je peux trouver trouve des erreurs de réparation. Donc, en mettant à jour vers Java 8, il y a une chance qu'il ne compile plus en raison de javac suivant plus correctement le JLS et qu'il y aura très peu, voire pas, "d'améliorations" à le bytecode.

81
Andrew

Le principal avantage est que Java 8 contient les dernières corrections de bogues et que Java 7 n'est pas mis à jour publiquement.

De même, si vous exécutez du code sur une machine virtuelle Java Java 8), vous pouvez également disposer d’une seule version de Java est installé.

Java 8 est peut-être plus rapide et supporte mieux les nouvelles fonctionnalités telles que G1. Cependant, comme votre cas d'utilisation est parfois plus lent, la seule façon de le savoir est de le tester.

Existe-t-il un avantage technique à mettre à niveau le code compilé avec le dernier Java 8 JDK?)?

Si vous demandez s'il est avantageux de recompiler 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, de sorte qu’il pourrait y avoir de très subtiles différences entre le compilateur Java 8] pourrait trouver que le = Java 7

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

22
Peter Lawrey

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

Lorsque vous passez à Java8, javac peut émettre des avertissements supplémentaires. Exemple: inférence de type a été grandement amélioré avec Java8. Et cela pourrait éliminer le besoin d'annotations @SuppressWarnings dans votre base de code actuelle (et lorsque ces annotations ne sont plus nécessaires, le compilateur vous 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 en dire plus. Augmenter vos connaissances peut vous aider à prendre des décisions éclairées.

D'autre part:

  • J'ai vu quelques questions ici sur (rares) les situations où Java8 a refusé de compiler du code Java7. Par conséquent, le passage à Java8 comporte également un risque (minime) de rencontrer ce type 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 chance que vous changiez d'avis plus tard. Et puis, lorsque vous ne faites pas attention, vous pourriez exploiter les fonctionnalités de Java8. Ce qui pourrait compliquer les "mises à jour de champs"; comme vous l'avez maintenant deux versions de votre code source à maintenir!
  • Ensuite: si des clients exécutent le produit à l’aide d’un programme Java7 jre; vous devez faire très attention aux corrections binaires que vous leur donnez. Nous avons une telle configuration; et j'ai perdu du temps plus d'une fois parce que j'avais accidentellement placé une seule classe compilée 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 en Java7.

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

21
GhostCat

Je ferais pour au moins ces faits.

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

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

3) Ramasse-miettes G1

EDIT

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 des développeurs, il y en a beaucoup. L’augmentation de la productivité est la plus importante pour moi.

EDIT 2

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

-paramètres

conserver les noms de paramètres de la méthode.

-profil

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

8
Eugene