Existe algum benefício em atualizar o código compilado do Java 7 para o Java 8?

127

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.

g8torPaul
fonte
2
Só para ficar claro. O código já é executado com o JRE 1.8 mais recente e, portanto, possui todas as mais recentes correções de bugs do Java 8 e melhorias no desempenho do tempo de execução (que eu saiba).
precisa saber é o seguinte
4
Esta é uma pergunta provavelmente mais sobre o bytecode sendo produzido pelo compilador. Talvez deixe isso um pouco mais claro na sua pergunta.
M Platvoet
2
Então, a produtividade aprimorada do desenvolvedor não é relevante aqui?
Mick Mnemonic
7
Como "Não planejo reescrever nenhum código" não está claro, não consigo acreditar.
eldo
3
Isso pode estar relacionado: stackoverflow.com/questions/21732290/…
Arnaud

Respostas:

82

Se eu entendi a pergunta corretamente, você quer saber se o bytecode produzido por javacserá "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 javacentre 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 de javacseguir o JLS mais corretamente e haverá muito pouco ou nenhum "aprimoramento" no bytecode.

Andrew
fonte
4
Obrigado, revi algumas das listas no OpenJDK e nada realmente se destaca, exceto que parece que elas melhoraram o desempenho do javac. Concordo que é quase impossível fazer uma pesquisa razoável de correções / recursos entre a versão do Java no site da Oracles. O formato das notas de versão de cada versão nem é consistente. Meu instinto me diz que não há nenhum benefício técnica para compilar com JDK 8 vs JDK 7.
g8torPaul
1
@ g8torPaul a menos que você estiver indo para usar apenas os recursos disponíveis em Java 8, por exemplo lamdbas / córregos
Peter Lawrey
21

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.

Existe algum benefício técnico em atualizar o código compilado para o Java 8 JDK mais recente?

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 invokedynamicqual foi adicionado para lambdas existia no Java 7, mas simplesmente não foi usado dessa maneira.

Peter Lawrey
fonte
8
Corrija-me se eu estiver errado, mas o OP pergunta sobre recompilar o código com o Java 8, enquanto sua resposta é sobre se deve usar o Java 8 para executá-lo?
21317 Tobias_k
5
Atualmente, estou executando o Java 1.8 JRE mais recente. Todas as correções de bugs e o código Java interno seriam fornecidos pelo JRE. Eu não acho que isso resolva minha pergunta.
precisa saber é o seguinte
16
Isso simplesmente não responde à pergunta. Se for "quase nada", por favor, esclareça qual é a diferença. Caso contrário, é apenas especulação
M Platvoet
1
@ Peter Lawrey, você diz que ".. a resposta é; quase nada". Temos alguma evidência para apoiar isso? BTW, eu tenderia a concordar com você.
precisa saber é o seguinte
2
@ g8torPaul O Java 8 foi projetado para ser compatível com versões anteriores do Java 7 e, se você não estiver usando nenhum dos recursos do Java 8, deve produzir quase exatamente o mesmo código de bytes.
Peter Peterrey
21

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:

  • Vi aqui algumas perguntas sobre (raras) situações em que o Java8 se recusou a compilar o código Java7. Portanto, mudar para Java8 também traz um risco (mínimo) de se deparar com esse tipo de problema.
  • E: mesmo quando você não pretende tocar sua base de código hoje , há uma certa chance de você mudar de idéia mais tarde. E então, quando não estiver prestando atenção, você poderá explorar os recursos Java8. O que poderia complicar "atualizações de campo"; agora você tem duas versões do seu código fonte para manter!
  • Então: caso você tenha clientes executando o produto usando um java7 jre; você precisa ter muito cuidado com as correções binárias que você fornece a elas. Nós temos essa configuração; e perdi tempo mais de uma vez porque acidentalmente coloquei uma única classe compilada em Java8 em um sistema de teste controlado por Java7. Isso simplesmente não pode acontecer quando o seu desenvolvedor e teste / configuração do cliente são todos Java7.

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).

GhostCat
fonte
2
Um exemplo de um problema tão raro do "Java8 se recusou a compilar o Java7": stackoverflow.com/q/41590024/2513200 (um problema conhecido do Oracle Compiler que afeta apenas o Java 8, mas nem 7 ou 9)
Hulk
8

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:

–Parâmetros

para preservar os nomes dos parâmetros do método.

-perfil

Chamada Compact Profile Option para uma área menor.

Eugene
fonte
26
Mas rodar no Java 8 já não daria esses benefícios? A verdadeira questão parece ser "posso escrever algo no Java 8 que funcione melhor que o equivalente ao Java 7".
Jorn Vernee
8
Atualmente, estou executando o Java 1.8 JRE mais recente. Todas as correções de bugs e o código Java interno seriam fornecidos pelo JRE. O coletor de lixo também faz parte do JRE. Eu não acho que isso resolva minha pergunta.
precisa saber é o seguinte
8
Os OPs do @JornVernee disseram explicitamente que ele não quer reescrever nada, então a pergunta, como eu a entendo, é mais como "o compilador Java 8 pode fazer truques que o compilador Java 7 não pode fazer"
tobias_k
2
@JornVernee A questão é, se o código escrito em Java 7 e compilados em Java 8 executa melhor, então o código compilado em Java 7
EarlGrey
6
Não responde à pergunta e apenas especula que ela não melhorou.
M Platvoet
-1

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:

  • O código-fonte do seu aplicativo é compatível com o Java 7 e provavelmente 8 também;
  • Na eventualidade de o código não compilar com o Java 8, ele provavelmente também não será compilado com um compilador Java 8 no modo de compatibilidade de origem Java 7 ( -source 7com javac);
  • Seus desenvolvedores e IC precisarão executar testes de unidade e integração em um tempo de execução Java 8 para ficar o mais próximo possível do ambiente de produção. Os desenvolvedores também precisarão executar o aplicativo no mesmo tempo de execução do Java 8 ao executá-lo localmente;
  • É mais difícil compilar com um JDK 7 e executar com um JRE 8 (no mesmo processo de compilação ou no mesmo IDE) do que fazer tudo com a mesma versão;
  • Não há benefício em usar em -source 7vez de -source 8se você compilar com um JDK 8 e seu tempo de execução de destino for Java 8;
  • O uso de -source 8garantias 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.

Didier L
fonte
O segundo marcador não está correto. Sua postagem é auto-contraditória em vários pontos.
Marquês de Lorne
@EJP O segundo ponto é mais da minha experiência, mas você tem um exemplo que compila no JDK 8 com, -source 7mas 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 ...
Didier L -