¿Hay algún beneficio en actualizar el código compilado de Java 7 a Java 8?

127

Tengo una aplicación antigua escrita con Java 7. Se ejecuta bien en Java 8 JRE. No planeo reescribir ninguno de los códigos para utilizar las funciones de Java 8. ¿Existe algún beneficio técnico al actualizar el código compilado al último Java 8 JDK?

Para ser claros, el código está actualmente compilado con Java 7 y ya se está ejecutando con el último Java 8 JRE. Ya debería beneficiarse de las mejoras en tiempo de ejecución de Java 8. Esta pregunta es si se obtendrían beneficios compilando con la versión 8 y ejecutando con el código de bytes compilado de Java 8.


Además, no me interesan los beneficios no técnicos, como la productividad del desarrollador. Creo que esos son importantes, pero no el punto de esta pregunta. Pido por el bien del código de producción que NO tiene equipo de desarrollo. Está puramente en modo de mantenimiento.

g8torPaul
fuente
2
Para ser claro. El código ya se ejecuta con la última versión 1.8 JRE y, por lo tanto, tiene todas las últimas correcciones de errores de Java 8 y mejoras de rendimiento en tiempo de ejecución (que yo sepa).
g8torPaul
44
Esta es probablemente una pregunta más sobre el bytecode que genera el compilador. Tal vez deje eso un poco más claro en su pregunta.
M Platvoet
2
Entonces, ¿mejorar la productividad del desarrollador no es relevante aquí?
Mick Mnemonic
77
¿Cómo puede "No planeo reescribir ninguno de los códigos" no estar claro? No puedo creerlo.
eldo
3
Esto puede estar algo relacionado: stackoverflow.com/questions/21732290/…
Arnaud

Respuestas:

82

Si entiendo la pregunta correctamente, desea saber si el código de bytes producido por javacserá "mejor" en Java 8 que en Java 7.

La respuesta probablemente no sea, corrigen constantemente los errores en el compilador y eso a veces conduce a un código de bytes más eficiente. Pero no veré ninguna aceleración significativa de estas correcciones para Java 8 hasta donde puedo ver, el registro de cambios solo enumera 2 cambios principales entre versiones.

El sitio web de Oracle es terrible y parece que no puedo obtener una lista de correcciones de errores relacionadas javacentre versiones, pero aquí hay una no exhaustiva de OpenJDK . La mayoría de los que puedo encontrar son errores de reparación. Por lo tanto, al actualizar a Java 8, existe la posibilidad de que ya no se compile debido a que javacsigue más correctamente el JLS y habrá muy pocas o ninguna "mejora" en el código de bytes.

Andrés
fuente
44
Gracias, he revisado parte de la lista en OpenJDK y nada destaca realmente, excepto que parece que han mejorado el rendimiento de javac. Estoy de acuerdo en que es casi imposible hacer una búsqueda razonable de correcciones / características entre la versión de Java en el sitio web de Oracles. El formato de las notas de la versión para cada versión ni siquiera es consistente. Mi instinto me dice que no hay ningún beneficio técnica para compilar con el JDK 8 vs JDK 7.
g8torPaul
1
@ g8torPaul, a menos que vaya a utilizar funciones solo disponibles en Java 8, por ejemplo, lamdbas / streams
Peter Lawrey
21

El principal beneficio es que Java 8 tiene las últimas correcciones de errores, ya que Java 7 no se actualiza públicamente.

Además, si va a ejecutar código en una JVM Java 8, también puede tener instalada una sola versión de Java.

Java 8 podría ser más rápido y tiene mejor soporte para nuevas características como G1. Sin embargo, puede ser más lento para su caso de uso, por lo que la única forma de saberlo es probarlo.

¿Existe algún beneficio técnico al actualizar el código compilado al último Java 8 JDK?

Si está preguntando si hay algún beneficio en volver a compilar el código Java 7 en un compilador Java 8, la respuesta es; casi nada.

La única diferencia sutil es que ha habido diferencias menores en la API de Java, por lo que puede haber diferencias muy sutiles que el compilador de Java 8 puede encontrar que Java 7

Otras diferencias menores son el número mágico al comienzo del archivo, posiblemente el orden del grupo constante. El código de bytes es básicamente el mismo, incluso el soporte para el invokedynamicque se agregó lambdas existía en Java 7, pero simplemente no se usó de esa manera.

Peter Lawrey
fuente
8
Corrígeme si me equivoco, pero OP pregunta acerca de volver a compilar el código con Java 8, mientras que tu respuesta es sobre si usar Java 8 para ejecutarlo.
tobias_k
55
Actualmente estoy ejecutando el último Java 1.8 JRE. JRE proporcionará todas las correcciones de errores y el código interno de Java. No creo que esto aborde mi pregunta.
g8torPaul
16
Esto simplemente no responde la pregunta. Si es "casi nada", aclare cuál es la diferencia. De lo contrario, solo está especulando
M Platvoet 02 de
1
@ Peter Lawrey, dices que "... la respuesta es; casi nada". ¿Tenemos alguna evidencia para apoyar eso? Por cierto, me gustaría estar de acuerdo contigo.
g8torPaul
2
@ g8torPaul Java 8 está diseñado para ser compatible con versiones anteriores de Java 7 y si no está utilizando ninguna de las características de Java 8, debería producir casi exactamente el mismo código de bytes.
Peter Lawrey
21

Podría ayudar creando conciencia .

Cuando cambie a Java8, es posible que encuentre advertencias adicionales emitidas por javac. Ejemplo: la inferencia de tipos se ha mejorado enormemente con Java8. Y eso podría eliminar la necesidad de anotaciones @SuppressWarnings en su base de código actual (y cuando tales anotaciones ya no son necesarias, el compilador advierte sobre eso).

Entonces, incluso si no tiene la intención de modificar su base de código hoy, cambiar a Java8 podría informarle sobre tales cosas. Aumentar su conocimiento puede ayudarlo a tomar decisiones informadas.

Por otra parte:

  • Vi algunas preguntas aquí sobre situaciones (raras) en las que Java8 se negaba a compilar el código Java7. Por lo tanto, cambiar a Java8 también conlleva un riesgo (mínimo) de encontrarse con ese tipo de problema.
  • Y: incluso si no tiene la intención de tocar su base de código hoy , existe una cierta posibilidad de que cambie de opinión más adelante. Y luego, cuando no prestas atención, puedes explotar las características de Java8. Lo que podría complicar las "actualizaciones de campo"; ¡ya que tiene dos versiones de su código fuente para mantener!
  • Entonces: en caso de que haya clientes que ejecuten el producto utilizando un java7 jre; tienes que tener mucho cuidado con las correcciones binarias que les das. Tenemos tal configuración; y he perdido el tiempo más de una vez porque accidentalmente puse una sola clase compilada en Java8 en un sistema de prueba controlado por Java7. Eso simplemente no puede suceder cuando su configuración de desarrollo y prueba / cliente es todo Java7.

En pocas palabras: hay algunas ventajas sutiles y ciertos riesgos (donde la importancia de los riesgos depende principalmente de su configuración general).

GhostCat
fuente
2
Un ejemplo de un problema tan raro como "Java8 se negó a compilar Java7": stackoverflow.com/q/41590024/2513200 (un problema conocido del compilador de Oracle solo afecta a Java 8, pero tampoco 7 o 9)
Hulk
8

Lo haría por al menos estos hechos.

1) Elementos internos de HashMap (es más rápido bajo jdk-8)

2) Se corrigieron muchos errores que podrían ser transparentes para usted (optimizaciones de tiempo de ejecución) que harán que su código sea más rápido y mejor sin que realmente haga nada.

3) Recolector de basura G1

EDITAR

Desde un punto de vista técnico, esto suena más como algo relacionado con la compilación Ahead of Time o algo que un compilador podría mejorar analizando más el código. Hasta donde yo sé, esas cosas no se hacen en el compilador de Java 8.

Desde el punto de vista del desarrollador, hay muchos. El aumento de la productividad es lo más importante para mí.

EDITAR 2

Solo conozco dos puntos que coinciden con su segunda consulta:

–Parámetros

para preservar los nombres de los parámetros del método.

-perfil

Llamada Opción de perfil compacto para una huella más pequeña.

Eugene
fuente
26
Sin embargo, ¿no solo correr con Java 8 ya daría estos beneficios? La verdadera pregunta parece ser, "¿puedo escribir algo en Java 8 que funcione mejor que el equivalente de Java 7".
Jorn Vernee
8
Actualmente estoy ejecutando el último Java 1.8 JRE. JRE proporcionará todas las correcciones de errores y el código interno de Java. El recolector de basura también es parte del JRE. No creo que esto aborde mi pregunta.
g8torPaul
8
Los OP de @JornVernee dijeron explícitamente que no quiere reescribir nada, por lo que la pregunta, según tengo entendido, es más como "¿puede el compilador de Java 8 hacer algún truco que el compilador de Java 7 no puede hacer"
tobias_k
2
@JornVernee La pregunta es, si el código escrito en Java 7 y compilado en Java 8 se ejecuta mejor que el código compilado en Java 7
EarlGrey
66
No responde la pregunta y simplemente especula que no ha mejorado.
M Platvoet
-1

Si no tiene otras razones para recompilar su aplicación, probablemente no haga mucha diferencia, como se indica en la respuesta aceptada.

Sin embargo, si tiene que volver a compilarlo solo una vez, considere esto:

  • El código fuente de su aplicación es compatible con Java 7, y muy probablemente también con 8;
  • En el caso de que el código no se compile con Java 8, probablemente tampoco se compilará con un compilador Java 8 en modo de compatibilidad de fuente Java 7 ( -source 7con javac);
  • Sus desarrolladores y CI necesitarán ejecutar pruebas de unidad e integración contra un tiempo de ejecución de Java 8 para estar lo más cerca posible del entorno de producción. Los desarrolladores también deberán ejecutar la aplicación en el mismo tiempo de ejecución de Java 8 cuando la ejecuten localmente;
  • Es más difícil compilar con un JDK 7 y ejecutar con un JRE 8 (en el mismo proceso de compilación o en el mismo IDE) que hacer todo con la misma versión;
  • No hay ningún beneficio de usar en -source 7lugar de -source 8si compila con un JDK 8 y su tiempo de ejecución de destino es Java 8;
  • El uso de -source 8garantías de que el desarrollador está utilizando Java 8 (o posterior) para la compilación y el tiempo de ejecución (como se aplica -target 8).

En conclusión, no lo vuelva a compilar si no lo necesita. Sin embargo, en la primera ocasión, debe volver a compilar (debido a cambios en el código), cambiar a Java 8. No corra el riesgo de tener un error debido a desajustes del entorno y no restrinja a los desarrolladores sin una buena razón.

Didier L
fuente
La segunda viñeta no es correcta. Tu publicación es contradictoria en varios puntos.
Marqués de Lorne
@EJP La segunda viñeta es más de mi experiencia, pero ¿tiene un ejemplo que compila en JDK 8 con -source 7pero no compila -source 8? Además, ¿podría indicar las contradicciones ya que su comentario no es muy constructivo como tal ...?
Didier L