C'è qualche vantaggio nell'aggiornamento del codice compilato Java 7 a Java 8?


127

Ho una vecchia applicazione scritta usando Java 7. Funziona bene in un Java 8 JRE. Non intendo riscrivere alcun codice per utilizzare le funzionalità di Java 8. C'è qualche vantaggio tecnico nell'aggiornamento del codice compilato all'ultima JDK Java 8?

Per essere chiari, il codice è attualmente compilato con Java 7 e già in esecuzione con l'ultimo Java 8 JRE. Dovrebbe già beneficiare dei miglioramenti del runtime Java 8. Questa domanda è se si potrebbero ottenere benefici compilando con la versione 8 ed eseguendo con il codice byte compilato Java 8.


Inoltre, non mi occupo di vantaggi non tecnici come la produttività degli sviluppatori. Penso che siano importanti ma non il punto di questa domanda. Sto chiedendo il bene del codice di produzione che NON ha un team di sviluppo. È puramente in modalità manutenzione.


2
Giusto per essere chiari. Il codice funziona già con l'ultimo JRE 1.8 e quindi ha tutte le ultime correzioni di bug di Java 8 e miglioramenti delle prestazioni di runtime (per quanto ne so).
g8torPaul,

4
Questa è probabilmente una domanda in più sul bytecode che viene compilato dal compilatore. Forse rendilo un po 'più chiaro nella tua domanda.
M Platvoet,

2
Quindi una maggiore produttività degli sviluppatori non è rilevante qui?
Mick Mnemonic,

7
Come può "non intendo riscrivere il codice" non essere chiaro non ci posso credere.
eldo,

3
Ciò può essere in qualche modo correlato: stackoverflow.com/questions/21732290/…
Arnaud,

Risposte:


82

Se capisco correttamente la domanda, vuoi sapere se il bytecode prodotto da javac sarà "migliore" in Java 8 che in Java 7.

La risposta è probabilmente no, correggono costantemente i bug nel compilatore e questo a volte porta a bytecode più efficiente. Ma non vedrai alcuna accelerazione significativa da queste correzioni per Java 8 per quanto posso vedere, il registro delle modifiche elenca solo 2 importanti cambiamenti tra le versioni.

Il sito web di Oracle è terribile e non riesco a ottenere un elenco di correzioni di bug correlate javactra le versioni, ma qui non è esaustivo da OpenJDK . La maggior parte di quelli che riesco a trovare stanno risolvendo errori. Quindi, aggiornando a Java 8, c'è la possibilità che non si compili più a causa di javacuna corretta esecuzione del JLS e ci saranno pochissimi "miglioramenti" al bytecode.


4
Grazie, ho esaminato parte dell'elenco su OpenJDK e nulla spicca davvero tranne che sembra che abbiano migliorato le prestazioni di javac. Sono d'accordo che è quasi impossibile effettuare una ricerca ragionevole di correzioni / funzionalità tra la versione di Java sul sito Web di Oracles. Il formato delle note di rilascio per ogni versione non è nemmeno coerente. Il mio istinto mi dice che non ci sono vantaggi tecnici per la compilazione con JDK 8 vs JDK 7.
g8torPaul

1
@ g8torPaul a meno che non utilizzerai le funzioni disponibili solo in Java 8, ad esempio lamdbas / stream
Peter Lawrey,

21

Il vantaggio principale è che Java 8 ha le ultime correzioni di bug in cui Java 7 non viene aggiornato pubblicamente.

Inoltre, se si esegue il codice su una JVM Java 8, è possibile che sia installata una sola versione di Java.

Java 8 potrebbe essere più veloce e ha un supporto migliore per nuove funzionalità come G1. Tuttavia, potrebbe essere più lento per il tuo caso d'uso, quindi l'unico modo per saperlo è testarlo.

C'è qualche vantaggio tecnico nell'aggiornamento del codice compilato all'ultima JDK Java 8?

Se si sta chiedendo se ci sia qualche vantaggio nel ricompilare il codice Java 7 in un compilatore Java 8, la risposta è; quasi niente.

L'unica differenza sottile è che ci sono state differenze minori nell'API Java, quindi potrebbero esserci differenze molto sottili che il compilatore Java 8 potrebbe scoprire che Java 7

Altre differenze minori sono il numero magico all'inizio del file, probabilmente l'ordine del pool costante. Il codice byte è sostanzialmente lo stesso, anche il supporto per il invokedynamicquale è stato aggiunto per lambdas esiste in Java 7 ma non è stato utilizzato in questo modo.


8
Correggimi se sbaglio, ma OP chiede di ricompilare il codice con Java 8, mentre la tua risposta è se usare Java 8 per eseguirlo?
tobias_k,

5
Attualmente sto utilizzando l'ultimo Java JRE 1.8. Tutte le correzioni di bug e il codice Java interno sarebbero forniti da JRE. Non penso che questo affronti la mia domanda.
g8torPaul,

16
Questo semplicemente non risponde alla domanda. Se è "quasi nulla", chiarisci qual è la differenza. Altrimenti è solo una speculazione
M Platvoet,

1
@Peter Lawrey, dici che ".. la risposta è; quasi nulla". Abbiamo prove a sostegno di ciò? A proposito, vorrei essere d'accordo con te.
g8torPaul,

2
@ g8torPaul Java 8 è progettato per essere retrocompatibile con Java 7 e se non si utilizza nessuna delle funzionalità di Java 8, dovrebbe produrre quasi esattamente lo stesso codice byte.
Peter Lawrey,

21

Potrebbe aiutare creando consapevolezza .

Quando passi a Java8, potresti trovare ulteriori avvisi emessi da javac. Esempio: digitare l'inferenza è stata notevolmente migliorata con Java8. E ciò potrebbe eliminare la necessità di annotazioni @SuppressWarnings nella tua base di codice corrente (e quando tali annotazioni non sono più necessarie, il compilatore lo avverte).

Quindi, anche quando non intendi modificare la tua base di codice oggi, passare a Java8 potrebbe parlarti di queste cose. Aumentare le tue conoscenze può aiutare a prendere decisioni informate.

D'altro canto:

  • Ho visto alcune domande qui su (rare) situazioni in cui Java8 ha rifiutato di compilare il codice Java7. Quindi, passare a Java8 comporta anche un rischio (minimo) di incorrere in quel tipo di problema.
  • E: anche quando non hai intenzione di toccare la tua base di codice oggi , c'è una certa possibilità che cambi idea in seguito. E poi, quando non presti attenzione, potresti sfruttare le funzionalità di Java8. Il che potrebbe complicare gli "aggiornamenti sul campo"; dato che ora hai due versioni del tuo codice sorgente da mantenere!
  • Quindi: nel caso in cui i clienti eseguano il prodotto utilizzando un java7 jre; devi stare molto attento alle correzioni binarie che dai a loro. Abbiamo una tale configurazione; e ho perso tempo più di una volta perché ho accidentalmente messo una singola classe compilata Java8 su un sistema di test guidato da Java7. Questo semplicemente non può accadere quando il tuo sviluppo e test / configurazione del cliente sono tutti Java7.

Per farla breve: ci sono alcuni vantaggi sottili e alcuni rischi (in cui la significatività dei rischi dipende principalmente dalla configurazione generale).


2
Un esempio di tale un raro "Java8 rifiutato di compilare Java7" problema: stackoverflow.com/q/41590024/2513200 (un problema noto della Oracle Compiler unica che interessano Java 8, ma né 7 o 9)
Hulk

8

Lo farei almeno per questi fatti.

1) HashMap internals (è più veloce con jdk-8)

2) Molti bug risolti che potrebbero essere trasparenti per te (ottimizzazioni di runtime) che renderanno il tuo codice più veloce e migliore senza che tu effettivamente faccia nulla.

3) G1 Garbage Collector

MODIFICARE

Da un punto di vista tecnico questo suona più come qualcosa a che fare con Ahead of Time Compilation o qualcosa che un compilatore potrebbe migliorare analizzando di più il codice. Per quanto ne so, queste cose non vengono fatte nel compilatore Java 8.

Dal punto di vista degli sviluppatori: ce ne sono molti. L'aumento della produttività è il più importante per me.

MODIFICA 2

Conosco solo due punti che corrispondono alla tua seconda query:

-parametri

per preservare i nomi dei parametri del metodo.

-profilo

Chiamata opzione profilo compatto per un ingombro ridotto.


26
Non sarebbe solo correre in Java 8 già dare questi vantaggi però? La vera domanda sembra essere "posso scrivere qualcosa in Java 8 che funzioni meglio dell'equivalente Java 7".
Jorn Vernee,

8
Attualmente sto utilizzando l'ultimo Java JRE 1.8. Tutte le correzioni di bug e il codice Java interno sarebbero forniti da JRE. Anche il Garbage collector fa parte di JRE. Non penso che questo affronti la mia domanda.
g8torPaul,

8
Gli OP di @JornVernee hanno detto esplicitamente che non vuole riscrivere nulla, quindi la domanda, a quanto ho capito, è più simile a "il compilatore Java 8 può fare qualche trucco che il compilatore Java 7 non può fare"
tobias_k

2
@JornVernee La domanda è: se il codice scritto in Java 7 e compilato in Java 8 funziona meglio del codice compilato in Java 7
EarlGrey,

6
Non risponde alla domanda e si limita a ipotizzare che non sia migliorata.
M Platvoet,

-1

Se non hai altri motivi per ricompilare la tua domanda, probabilmente non fa molta differenza, come indicato nella risposta accettata.

Tuttavia, se devi ricompilarlo anche solo una volta, considera questo:

  • Il codice sorgente dell'applicazione è compatibile con Java 7 e molto probabilmente anche con 8;
  • Nel caso in cui il codice non venga compilato con Java 8, probabilmente non verrà compilato neanche con un compilatore Java 8 in modalità compatibilità sorgente Java 7 (-source 7 con javac);
  • Gli sviluppatori e gli elementi della configurazione dovranno eseguire test di unità e integrazione su un runtime Java 8 per avvicinarsi il più possibile all'ambiente di produzione. Gli sviluppatori dovranno anche eseguire l'applicazione sullo stesso runtime Java 8 quando la eseguono localmente;
  • È più difficile compilare con un JDK 7 ed eseguire con un JRE 8 (nello stesso processo di compilazione o nello stesso IDE) che fare tutto con la stessa versione;
  • Non vi è alcun vantaggio nell'utilizzare -source 7invece che -source 8se si compila con un JDK 8 e il runtime di destinazione è Java 8;
  • L'utilizzo -source 8garantisce che lo sviluppatore stia utilizzando Java 8 (o versione successiva) sia per la compilazione che per il runtime (come previsto -target 8).

In conclusione, non ricompilarlo se non è necessario. Tuttavia, alla prima occasione è necessario ricompilare (a causa di modifiche del codice), passare a Java 8. Non correre il rischio di avere un bug a causa di disallineamenti ambientali e non limitare gli sviluppatori senza una buona ragione.


Il secondo punto elenco non è corretto. Il tuo post è contraddittorio in diversi punti.
Marchese di Lorne,

@EJP Il secondo punto è più della mia esperienza, ma hai un esempio che viene compilato in JDK 8 -source 7ma non compilato -source 8? Inoltre, potresti indicare le contraddizioni in quanto il tuo commento non è molto costruttivo in quanto tale ...
Didier L
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.