Java 7 derlenmiş kodunu Java 8'e yükseltmenin herhangi bir faydası var mı?


127

Java 7 kullanılarak yazılmış eski bir uygulamam var. Java 8 JRE'de sorunsuz çalışıyor. Java 8 özelliklerinden yararlanmak için herhangi bir kodu yeniden yazmayı planlamıyorum. Derlenen kodu en son Java 8 JDK'ya yükseltmenin herhangi bir teknik faydası var mı?

Açık olmak gerekirse, kod şu anda Java 7 ile derlenmiştir ve halihazırda en son Java 8 JRE ile çalışmaktadır. Java 8 çalışma zamanı geliştirmelerinden zaten yararlanmalıdır. Bu soru, sürüm 8 ile derlenip Java 8 derlenmiş bayt kodu ile çalıştırılarak herhangi bir fayda sağlanıp sağlanamayacağıdır.


Ayrıca, geliştirici üretkenliği gibi teknik olmayan faydalarla ilgilenmiyorum. Bunların önemli olduğunu düşünüyorum ama bu sorunun amacı değil. HİÇBİR geliştirme ekibine sahip olmayan üretim kodu uğruna rica ediyorum. Tamamen bakım modunda.


2
Açık olmak gerekirse. Kod zaten en son 1.8 JRE ile çalışıyor ve bu nedenle en son Java 8 hata düzeltmelerine ve çalışma zamanı performans iyileştirmelerine (bildiğim kadarıyla) sahip.
g8torPaul

4
Bu muhtemelen daha çok bayt kodunun derleyici tarafından çıktısı ile ilgili bir sorudur. Belki bunu sorunuzda biraz daha netleştirin.
M Platvoet

2
Yani iyileştirilmiş geliştirici üretkenliği burada geçerli değil mi?
Mick Mnemonic

7
"Kodlardan herhangi birini yeniden yazmayı planlamıyorum" nasıl anlaşılır olamaz inanamıyorum.
eldo

3
Bu biraz ilgili olabilir: stackoverflow.com/questions/21732290/…
Arnaud

Yanıtlar:


82

Soruyu doğru anlarsam, tarafından üretilen bayt kodunun javacJava 8'de Java 7'den "daha iyi" olup olmayacağını bilmek istersiniz .

Cevap muhtemelen değil, derleyicideki hataları sürekli düzeltirler ve bu bazen daha verimli bytecode sağlar. Ancak gördüğüm kadarıyla Java 8 için bu düzeltmelerden önemli bir hızlanma görmeyeceksiniz, değişiklik günlüğü yalnızca sürümler arasındaki 2 büyük değişikliği listeler.

Oracle web sitesi berbat ve javacsürümler arasındaki hata düzeltmelerinin bir listesini alamıyorum , ancak burada OpenJDK'dan kapsamlı olmayan bir liste var . Bulmayı başardıklarımın çoğu hataları düzeltmek. Bu yüzden Java 8'e güncelleme yaparak javac, JLS'yi daha doğru bir şekilde takip etmesi nedeniyle artık derlenmeyeceği bir şans vardır ve bayt kodunda çok az "iyileştirme" olacaktır veya hiç olmayacaktır.


4
Teşekkürler, OpenJDK'daki listelerin bir kısmını gözden geçirdim ve javac'ın performansını iyileştirdikleri görülmesi dışında hiçbir şey gerçekten göze çarpmıyor. Oracles web sitesindeki Java sürümü arasında makul bir düzeltme / özellik araması yapmanın neredeyse imkansız olduğunu kabul ediyorum. Her sürüm için sürüm notlarının biçimi bile tutarlı değil.
İçimden gelen ses

1
@ g8torPaul, yalnızca Java 8'de bulunan özellikleri kullanmayacaksanız, örneğin lamdbas / streams
Peter Lawrey

21

Ana fayda, Java 8'in genel olarak güncellenmediği için Java 8'in en son hata düzeltmelerine sahip olmasıdır.

Ayrıca bir Java 8 JVM üzerinde kod çalıştıracaksanız, Java'nın yalnızca bir sürümüne sahip olabilirsiniz.

Java 8 daha hızlı olabilir ve G1 gibi yeni özellikler için daha iyi desteğe sahiptir. Bununla birlikte, kullanım durumunuz için daha yavaş olabilir, bu nedenle bilmenin tek yolu onu test etmektir.

Derlenen kodu en son Java 8 JDK'ya yükseltmenin herhangi bir teknik faydası var mı?

Java 7 kodunu bir Java 8 derleyicisinde yeniden derlemenin herhangi bir yararı olup olmadığını soruyorsanız, cevap; hemen hemen hiçbir şey.

Tek ince fark, Java API'sinde küçük farklılıklar olmasıdır, bu nedenle Java 8 derleyicisinin Java 7'de bulabileceği çok ince farklılıklar olabilir.

Diğer küçük farklar, dosyanın başlangıcındaki sihirli sayı, muhtemelen sabit havuzun sırasıdır. Bayt kodu temelde aynıdır, invokedynamiclambdalar için eklenen destek bile Java 7'de mevcuttu, ancak bu şekilde kullanılmadı.


8
Yanılıyorsam düzeltin, ancak OP kodu Java 8 ile yeniden derlemeyi sorarken, cevabınız Java 8'i çalıştırmak için kullanıp kullanmayacağınızla ilgili mi?
tobias_k

5
Şu anda en son Java 1.8 JRE ile çalışıyorum. Tüm hata düzeltmeleri ve dahili Java kodu JRE tarafından sağlanacaktır. Bunun sorumu karşıladığını sanmıyorum.
g8torPaul

16
Bu soruya cevap vermiyor. Eğer "neredeyse hiçbir şey" ise, lütfen farkın ne olduğunu açıklayın. Aksi takdirde sadece spekülasyon yapıyor
M Platvoet

1
@Peter Lawrey, ".. cevap; neredeyse hiçbir şey" diyorsunuz. Bunu destekleyecek herhangi bir kanıtımız var mı? BTW, seninle aynı fikirde olma eğilimindeydim.
g8torPaul

2
@ g8torPaul Java 8, Java 7 ile geriye dönük uyumlu olacak şekilde tasarlanmıştır ve Java 8'in herhangi bir özelliğini kullanmıyorsanız, neredeyse tamamen aynı bayt kodunu üretmelidir.
Peter Lawrey

21

Farkındalık yaratarak yardımcı olabilir .

Java8'e geçtiğinizde, javac tarafından gönderilen ek uyarılar görebilirsiniz. Örnek: tür çıkarımı , Java8 ile büyük ölçüde geliştirilmiştir. Ve bu, mevcut kod tabanınızda @SuppressWarnings ek açıklamalarına olan ihtiyacı ortadan kaldırabilir (ve bu tür ek açıklamalar artık gerekli olmadığında, derleyici bu konuda uyarır).

Bu nedenle, bugün kod tabanınızı değiştirmeyi düşünmeseniz bile, Java8'e geçmek size bu tür şeyler hakkında bilgi verebilir. Bilginizi artırmak, bilinçli kararlar vermenize yardımcı olabilir.

Diğer yandan:

  • Java8'in Java7 kodunu derlemeyi reddettiği (nadir) durumlar hakkında burada bazı sorular gördüm. Dolayısıyla, Java8'e geçiş aynı zamanda bu tür bir problemle karşılaşma (minimum) riski taşır.
  • Ve: bugün kod tabanınıza dokunmayı düşünmeseniz bile, daha sonra fikrinizi değiştirmeniz için belirli bir şans vardır. Ve sonra, dikkat etmediğinizde Java8 özelliklerinden yararlanabilirsiniz. Hangi olabilir "Saha güncellemeleri" zorlaştırmak; çünkü artık kaynak kodunuzun bakımını yapmanız gereken iki sürüm var !
  • Ardından: ürünü java7 jre kullanarak çalıştıran müşterileriniz olması durumunda; onlara verdiğiniz ikili düzeltmeler konusunda gerçekten dikkatli olmalısınız. Böyle bir düzene sahibiz; ve Java8 ile derlenmiş tek bir sınıfı yanlışlıkla Java7 güdümlü bir test sistemine koyduğum için birden fazla zaman harcadım. Geliştirme ve test / müşteri kurulumunuzun tamamı Java7 olduğunda bu gerçekleşemez.

Uzun lafın kısası: Birkaç ince avantaj ve belirli riskler vardır (risklerin önemi esas olarak genel kurulumunuza bağlıdır).


2
Böylesine nadir görülen bir "Java8, Java7'yi derlemeyi reddetti" sorununa bir örnek: stackoverflow.com/q/41590024/2513200 (Oracle Derleyicinin bilinen bir sorunu yalnızca Java 8'i etkiler, ancak 7 veya 9'u etkilemez)
Hulk

8

En azından bu gerçekler için yapardım .

1) HashMap dahili bileşenleri (jdk-8 altında daha hızlıdır)

2) Sizin için şeffaf olabilecek ve aslında hiçbir şey yapmadan kodunuzu daha hızlı ve daha iyi hale getirecek birçok hata düzeltildi (çalışma zamanı optimizasyonları).

3) G1 Çöp Toplayıcı

DÜZENLE

Teknik bir bakış açısından bu, daha çok Ahead of Time Compilation ile ilgili bir şeye veya bir derleyicinin kodu daha fazla analiz ederek geliştirebileceği bir şeye benziyor . Bildiğim kadarıyla bu tür şeyler java 8 derleyicisinde yapılmıyor.

Geliştirici bakış açısından - çok şey var. Benim için en önemli olan verimlilik artışı.

DÜZENLEME 2

İkinci sorgunuzla eşleşen yalnızca iki nokta biliyorum:

-parameters

yöntem parametre adlarını korumak için.

-profil

Daha küçük bir alan için Kompakt Profil Seçeneği olarak adlandırılır .


26
Yine de sadece Java 8 altında çalıştırmak bu avantajları sağlamaz mı? Asıl soru, "Java 8'de Java 7 eşdeğerinden daha iyi çalışan bir şey yazabilir miyim?" Gibi görünüyor.
Jorn Vernee

8
Şu anda en son Java 1.8 JRE ile çalışıyorum. Tüm hata düzeltmeleri ve dahili Java kodu JRE tarafından sağlanacaktır. Çöp toplayıcı da JRE'nin bir parçasıdır. Bunun sorumu karşıladığını sanmıyorum.
g8torPaul

8
@JornVernee OPs açıkça hiçbir şeyi yeniden yazmak istemediğini söyledi, bu yüzden soru, anladığım kadarıyla, daha çok "Java 8 derleyicisi, Java 7 derleyicisinin yapamayacağı herhangi bir numarayı yapabilir mi" gibi
tobias_k

2
@JornVernee Soru şu: Java 7'de yazılan ve Java 8'de derlenen kod Java 7'de derlenen koddan daha iyi çalışıyorsa
EarlGrey

6
Soruyu cevaplamıyor ve sadece gelişmediğini düşünüyor.
M Platvoet

-1

Başvurunuzu yeniden derlemek için başka nedeniniz yoksa, kabul edilen yanıtta belirtildiği gibi muhtemelen pek bir fark yaratmayacaktır.

Ancak, yalnızca bir kez bile yeniden derlemeniz gerekiyorsa, şunu göz önünde bulundurun:

  • Uygulama kaynak kodunuz Java 7 ve büyük olasılıkla 8 ile uyumludur;
  • Kodun Java 8 ile derlenmemesi durumunda, büyük olasılıkla Java 7 kaynak uyumluluk modunda ( -source 7javac ile) bir Java 8 derleyicisiyle derlenmeyecektir ;
  • Geliştiricilerinizin ve CI'nızın, üretim ortamına mümkün olduğunca yakın olması için Java 8 çalışma zamanına göre birim ve entegrasyon testleri çalıştırması gerekecektir. Ayrıca geliştiricilerin, uygulamayı yerel olarak çalıştırırken aynı Java 8 çalışma zamanında da çalıştırmaları gerekecektir;
  • JDK 7 ile derlemek ve bir JRE 8 ile çalıştırmak (aynı yapım sürecinde veya aynı IDE'de) her şeyi aynı sürümle yapmaktan daha zordur;
  • JDK 8 ile derlerseniz ve hedef çalışma zamanınız Java 8 ise -source 7bunun yerine kullanmanın bir yararı yoktur -source 8;
  • Kullanmak -source 8, geliştiricinin hem derleme hem de çalıştırma zamanı için (zorunlu kıldığı şekilde -target 8) Java 8 (veya daha üstünü) kullandığını garanti eder .

Sonuç olarak, ihtiyacınız yoksa yeniden derlemeyin. Ancak, ilk seferde yeniden derlemeniz (kod değişiklikleri nedeniyle), Java 8'e geçmeniz gerekir. Ortam uyumsuzlukları nedeniyle hata yapma riskini almayın ve iyi bir neden olmadan geliştiricileri kısıtlamayın.


İkinci madde işareti doğru değil. Gönderiniz birkaç noktada kendisiyle çelişiyor.
Marquis of Lorne

@EJP İkinci madde işareti daha çok deneyimim, ancak JDK 8'de derleyen -source 7ancak derlemeyen bir örneğiniz var -source 8mı? Ayrıca, yorumunuz o kadar da yapıcı olmadığı için çelişkileri belirtebilir misiniz ...
Didier L
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.