Eu tenho um aplicativo antigo escrito usando Java 7. Ele roda bem em um Java 8 JRE. Não pretendo reescrever nenhum código para usar os recursos do Java 8. Existe algum benefício técnico em atualizar o código compilado para o Java 8 JDK mais recente?
Para ficar claro, o código está atualmente compilado com o Java 7 e já em execução com o Java 8 JRE mais recente. Já deve se beneficiar das melhorias de tempo de execução do Java 8. Esta questão é se quaisquer benefícios seriam obtidos ao compilar com a versão 8 e executar com o código de bytes compilado do Java 8.
Além disso, não estou preocupado com benefícios não técnicos, como a produtividade do desenvolvedor. Eu acho que esses são importantes, mas não o objetivo desta questão. Estou pedindo o código de produção que NÃO possui equipe de desenvolvimento. É puramente no modo de manutenção.
fonte
Respostas:
Se eu entendi a pergunta corretamente, você quer saber se o bytecode produzido por
javac
será "melhor" no Java 8 do que no Java 7.A resposta provavelmente não é: eles constantemente corrigem erros no compilador e isso às vezes leva a um código de bytes mais eficiente. Mas você não verá nenhuma aceleração significativa dessas correções para o Java 8, tanto quanto eu posso ver, o changelog lista apenas duas grandes mudanças entre as versões.
O site da Oracle é terrível e não consigo obter uma lista de correções relacionadas
javac
entre as versões, mas aqui está uma não exaustiva do OpenJDK . A maioria dos que consigo encontrar estão corrigindo erros. Portanto, atualizando para o Java 8, há uma chance de ele não ser compilado mais devido ao fato dejavac
seguir o JLS mais corretamente e haverá muito pouco ou nenhum "aprimoramento" no bytecode.fonte
O principal benefício é que o Java 8 tem as correções de bugs mais recentes, onde o Java 7 não está sendo atualizado publicamente.
Além disso, se você estiver executando um código em uma Java 8 JVM, também poderá ter apenas uma versão do Java instalada.
O Java 8 pode ser mais rápido e possui melhor suporte para novos recursos como o G1. No entanto, pode ser mais lento para o seu caso de uso, portanto, a única maneira de saber é testá-lo.
Se você está perguntando se existe algum benefício em recompilar o código Java 7 em um compilador Java 8, a resposta é; quase nada.
A única diferença sutil é que houve pequenas diferenças na API Java, portanto, pode haver diferenças muito sutis que o compilador Java 8 pode achar que o Java 7
Outras pequenas diferenças são o número mágico no início do arquivo, possivelmente a ordem do pool constante. O código de byte é basicamente o mesmo, mesmo o suporte ao
invokedynamic
qual foi adicionado para lambdas existia no Java 7, mas simplesmente não foi usado dessa maneira.fonte
Poderia ajudar criando conscientização .
Ao alternar para o Java8, você pode encontrar avisos adicionais sendo emitidos pelo javac. Exemplo: a inferência de tipo foi bastante aprimorada com o Java8. E isso poderia eliminar a necessidade de anotações @SuppressWarnings em sua base de código atual (e quando essas anotações não forem mais necessárias, o compilador avisa sobre isso).
Portanto, mesmo quando você não pretende modificar sua base de código hoje, a mudança para o Java8 poderá falar sobre essas coisas. Aumentar seu conhecimento pode ajudar na tomada de decisões informadas.
Por outro lado:
Para encurtar a história: existem algumas vantagens sutis e certos riscos (onde a importância dos riscos depende principalmente de sua configuração geral).
fonte
Eu faria pelo menos esses fatos.
1) HashMap internos (é mais rápido sob jdk-8)
2) Muitos bugs corrigidos que podem ser transparentes para você (otimizações de tempo de execução) que tornarão seu código mais rápido e melhor sem você realmente fazer nada.
3) Coletor de lixo G1
EDITAR
Do ponto de vista técnico, isso parece mais algo com a compilação antecipada ou algo que um compilador pode melhorar analisando mais o código. Tanto quanto sei, essas coisas não são feitas no compilador java 8.
Do ponto de vista do desenvolvedor - há muitas. Maior produtividade é a mais importante para mim.
EDIT 2
Eu sei apenas dois pontos que correspondem à sua segunda consulta:
para preservar os nomes dos parâmetros do método.
Chamada Compact Profile Option para uma área menor.
fonte
Se você não tiver outros motivos para recompilar seu aplicativo, provavelmente não fará muita diferença, conforme indicado na resposta aceita.
No entanto, se você precisar recompilar apenas uma vez, considere o seguinte:
-source 7
com javac);-source 7
vez de-source 8
se você compilar com um JDK 8 e seu tempo de execução de destino for Java 8;-source 8
garantias de que o desenvolvedor está usando o Java 8 (ou posterior) para compilação e tempo de execução (conforme for imposto-target 8
).Em conclusão, não recompile se não precisar. No entanto, na primeira vez em que você precisar recompilar (devido a alterações no código), mude para o Java 8. Não corra o risco de ter um bug devido a incompatibilidades do ambiente e não restrinja os desenvolvedores sem um bom motivo.
fonte
-source 7
mas não com-source 8
? Além disso, você poderia indicar as contradições, já que o seu comentário não é muito construtivo como tal ...