Czy jest jakaś korzyść z uaktualnienia skompilowanego kodu Java 7 do Java 8?


127

Mam starą aplikację napisaną w Javie 7. Działa dobrze w środowisku JRE Java 8. Nie planuję przepisywania żadnego kodu w celu wykorzystania funkcji Java 8. Czy aktualizacja skompilowanego kodu do najnowszej JDK Java 8 ma jakieś techniczne korzyści?

Dla jasności, kod jest obecnie skompilowany w Javie 7 i już działa z najnowszym JRE Java 8. Powinien już skorzystać z ulepszeń środowiska wykonawczego Java 8. To pytanie dotyczy tego, czy kompilacja z wersją 8 i uruchomienie ze skompilowanym kodem bajtowym Java 8 przyniosłoby jakiekolwiek korzyści.


Nie przejmuję się też korzyściami pozatechnicznymi, takimi jak produktywność programistów. Myślę, że to jest ważne, ale nie o to chodzi w tym pytaniu. Proszę ze względu na kod produkcyjny, który NIE ma zespołu programistów. To jest wyłącznie w trybie konserwacji.


2
Żeby było jasne. Kod działa już z najnowszym JRE 1.8 i dlatego zawiera wszystkie najnowsze poprawki błędów Java 8 i ulepszenia wydajności środowiska wykonawczego (zgodnie z moją wiedzą).
— g8torPaul

4
Jest to prawdopodobnie bardziej pytanie o kod bajtowy wyprowadzany przez kompilator. Może wyjaśnij to nieco w swoim pytaniu.
— M Platvoet

2
Więc zwiększona produktywność programistów nie ma tutaj znaczenia?
— Mick Mnemonic

7
W jaki sposób „Nie planuję przepisywania żadnego kodu” nie jest jasne, nie mogę uwierzyć.
— eldo

3
Może to być trochę powiązane: stackoverflow.com/questions/21732290/ ...
— Arnaud

Odpowiedzi:


82

Jeśli dobrze rozumiem pytanie, chcesz wiedzieć, czy kod bajtowy wygenerowany przez javacbędzie „lepszy” w Javie 8 niż w Javie 7.

Odpowiedź prawdopodobnie nie brzmi, stale naprawiają błędy w kompilatorze, co czasami prowadzi do wydajniejszego kodu bajtowego. Ale o ile widzę, nie zobaczysz żadnego znaczącego przyspieszenia z tych poprawek dla Java 8, o ile widzę, dziennik zmian zawiera tylko 2 główne zmiany między wersjami.

Strona oracle jest okropna i nie wydaje mi się, aby uzyskać listę poprawek błędów związanych z javacmiędzy wersjami, ale tutaj nie jest wyczerpująca lista z OpenJDK . Większość z tych, które udało mi się znaleźć, to naprawianie błędów. Tak więc po aktualizacji do Java 8 jest szansa, że ​​nie będzie się już kompilował ze względu na javacbardziej poprawne śledzenie JLS i nie będzie żadnych "ulepszeń" w kodzie bajtowym.


4
Dzięki, przejrzałem część listy w OpenJDK i nic tam naprawdę nie wyróżnia się poza tym, że wygląda na to, że poprawili wydajność javaca. Zgadzam się, że rozsądne wyszukiwanie poprawek / funkcji pomiędzy wersjami Java na stronie internetowej Oracles jest prawie niemożliwe. Format informacji o wydaniu dla każdej wersji nie jest nawet spójny. Moje przeczucie mówi mi, że nie ma technicznych korzyści z kompilacji z JDK 8 vs JDK 7.
— g8torPaul

1
@ g8torPaul, chyba że zamierzasz korzystać z funkcji dostępnych tylko w Javie 8, np. lamdbas / streams
— Peter Lawrey

21

Główną korzyścią jest to, że Java 8 ma najnowsze poprawki błędów, ponieważ Java 7 nie jest publicznie aktualizowana.

Również jeśli zamierzasz uruchamiać kod na JVM Java 8, równie dobrze możesz mieć zainstalowaną tylko jedną wersję Javy.

Java 8 może być szybsza i lepiej obsługuje nowe funkcje, takie jak G1. Jednak może to być wolniejsze w twoim przypadku użycia, więc jedynym sposobem na sprawdzenie jest przetestowanie go.

Czy aktualizacja skompilowanego kodu do najnowszej JDK Java 8 ma jakieś techniczne korzyści?

Jeśli pytasz, czy jest jakaś korzyść z ponownej kompilacji kodu Java 7 w kompilatorze Java 8, odpowiedź brzmi; prawie nic.

Jedyną subtelną różnicą jest to, że wystąpiły drobne różnice w interfejsie API języka Java, więc mogą istnieć bardzo subtelne różnice, które kompilator Java 8 może wykryć, że Java 7

Inne drobne różnice to magiczna liczba na początku pliku, prawdopodobnie kolejność stałej puli. Kod bajtowy jest w zasadzie taki sam, nawet wsparcie, dla invokedynamicktórego dodano lambdy, istniało w Javie 7, ale po prostu nie było używane w ten sposób.


8
Popraw mnie, jeśli się mylę, ale OP pyta o rekompilację kodu za pomocą Java 8, podczas gdy Twoja odpowiedź dotyczy tego, czy użyć Java 8 do jej wykonania?
— tobias_k

5
Obecnie pracuję pod najnowszą wersją JRE Java 1.8. Wszystkie poprawki błędów i wewnętrzny kod Java byłyby dostarczane przez środowisko JRE. Nie sądzę, żeby to odpowiadało na moje pytanie.
— g8torPaul

16
To po prostu nie odpowiada na pytanie. Jeśli to „prawie nic”, wyjaśnij, jaka jest różnica. W przeciwnym razie to tylko spekulacje
— M Platvoet

1
@Peter Lawrey, Mówisz, że „… odpowiedź brzmi; prawie nic”. Czy mamy jakieś dowody na poparcie tego? Przy okazji, zgodziłbym się z tobą.
— g8torPaul

2
@ g8torPaul Java 8 została zaprojektowana tak, aby była kompatybilna wstecz z Javą 7 i jeśli nie używasz żadnej z funkcji Java 8, powinna generować prawie dokładnie taki sam kod bajtowy.
— Peter Lawrey

21

Może pomóc, tworząc świadomość .

Po przełączeniu się na Java8 możesz zauważyć dodatkowe ostrzeżenia emitowane przez javac. Przykład: wnioskowanie o typie zostało znacznie ulepszone w Javie8. A to może wyeliminować potrzebę stosowania adnotacji @SuppressWarnings w bieżącej bazie kodu (a gdy takie adnotacje nie są już wymagane, kompilator ostrzega o tym).

Tak więc, nawet jeśli nie zamierzasz dziś modyfikować swojej bazy kodu, przejście na Java8 może powiedzieć Ci o takich rzeczach. Poszerzenie wiedzy może pomóc w podejmowaniu świadomych decyzji.

Z drugiej strony:

  • Widziałem tutaj kilka pytań dotyczących (rzadkich) sytuacji, w których Java8 odmówiła kompilacji kodu Java7. Tak więc przejście na Java8 niesie ze sobą (minimalne) ryzyko napotkania tego rodzaju problemu.
  • A: nawet jeśli nie zamierzają dotknąć swoją bazę kodu dzisiaj , istnieje pewna szansa, że później zmienić zdanie na temat. A potem, nie zwracając uwagi, możesz wykorzystać funkcje Java8. Co może skomplikować „aktualizacje terenowe”; ponieważ masz teraz do utrzymania dwie wersje swojego kodu źródłowego!
  • Następnie: w przypadku, gdy masz klientów korzystających z produktu przy użyciu środowiska java7 jre; musisz bardzo uważać na poprawki binarne, które im dajesz. Mamy taką konfigurację; i straciłem czas więcej niż jeden raz, ponieważ przypadkowo umieściłem pojedynczą klasę skompilowaną w Javie8 w systemie testowym opartym na Java7. To po prostu nie może się zdarzyć, gdy twoja konfiguracja deweloperska i testowa / klienta to Java7.

Krótko mówiąc: istnieje kilka subtelnych zalet i pewne ryzyko (gdzie znaczenie ryzyka zależy głównie od ogólnej konfiguracji).


2
Jeden z przykładów tak rzadkiego problemu „Java8 odmówił kompilacji Java7”: stackoverflow.com/q/41590024/2513200 (znany problem dotyczący kompilatora Oracle dotyczy tylko Javy 8, ale ani 7, ani 9)
— Hulk

8

Zrobiłbym przynajmniej dla tych faktów.

1) Wewnętrzne funkcje HashMap (jest szybsze pod jdk-8)

2) Naprawiono wiele błędów, które mogą być dla Ciebie niewidoczne (optymalizacje w czasie wykonywania), które sprawią, że Twój kod będzie szybszy i lepszy bez robienia czegokolwiek.

3) G1 Garbage Collector

EDYTOWAĆ

Z technicznego punktu widzenia brzmi to bardziej jak coś związanego z kompilacją wyprzedzającą czas lub coś, co kompilator może ulepszyć, analizując kod. O ile wiem, takich rzeczy nie robi się w kompilatorze Java 8.

Z punktu widzenia dewelopera - jest ich mnóstwo. Zwiększona produktywność jest dla mnie najważniejsza.

EDYCJA 2

Znam tylko dwa punkty, które pasują do twojego drugiego zapytania:

–Parametry

aby zachować nazwy parametrów metod.

-profil

Opcja zwana kompaktowym profilem zapewniająca mniejszą powierzchnię.


26
Czy jednak samo uruchomienie w Javie 8 nie przyniosłoby już tych korzyści? Wydaje się, że prawdziwe pytanie brzmi: „czy mogę napisać coś w Javie 8, co działa lepiej niż jej odpowiednik w Javie 7”.
— Jorn Vernee

8
Obecnie pracuję pod najnowszą wersją JRE Java 1.8. Wszystkie poprawki błędów i wewnętrzny kod Java byłyby dostarczane przez środowisko JRE. Garbage collector jest również częścią środowiska JRE. Nie sądzę, żeby to odpowiadało na moje pytanie.
— g8torPaul

8
@JornVernee OPs wyraźnie powiedział, że nie chce niczego przepisywać, więc pytanie, jak rozumiem, brzmi bardziej jak „Czy kompilator Java 8 może zrobić jakieś sztuczki, których kompilator Java 7 nie może zrobić”
— tobias_k

2
@JornVernee Pytanie brzmi, czy kod napisany w Javie 7 i skompilowany w Javie 8 działa lepiej niż kod skompilowany w Javie 7
— EarlGrey

6
Nie odpowiada na pytanie i jedynie spekuluje, że nie poprawiło się.
— M Platvoet

-1

Jeśli nie masz innych powodów, aby ponownie skompilować swoją aplikację, prawdopodobnie nie robi to dużej różnicy, jak stwierdzono w zaakceptowanej odpowiedzi.

Jeśli jednak musisz go przekompilować choćby raz, rozważ to:

  • Twój kod źródłowy aplikacji jest zgodny z Javą 7, a najprawdopodobniej również z 8;
  • W przypadku gdyby kod nie skompilował się z Javą 8, prawdopodobnie nie zostanie skompilowany również z kompilatorem Java 8 w trybie zgodności ze źródłami Java 7 ( -source 7z javac);
  • Twoi programiści i CI będą musieli uruchamiać testy jednostkowe i integracyjne w środowisku wykonawczym Java 8, aby być jak najbliżej środowiska produkcyjnego. Programiści będą również musieli uruchamiać aplikację w tym samym środowisku wykonawczym Java 8 podczas uruchamiania jej lokalnie;
  • Trudniej jest skompilować z JDK 7 i uruchomić ze środowiskiem JRE 8 (w tym samym procesie budowania lub w tym samym IDE) niż robienie wszystkiego z tą samą wersją;
  • Nie ma korzyści z używania -source 7zamiast, -source 8jeśli kompilujesz z JDK 8, a docelowym środowiskiem wykonawczym jest Java 8;
  • Korzystanie z -source 8gwarancji, że programista używa języka Java 8 (lub nowszego) zarówno do kompilacji, jak i do środowiska wykonawczego (wymuszane -target 8).

Podsumowując, nie kompiluj go ponownie, jeśli nie musisz. Jednak za pierwszym razem musisz ponownie skompilować (z powodu zmian w kodzie), przełączyć się na Javę 8. Nie ryzykuj wystąpienia błędu z powodu niezgodności środowiska i nie ograniczaj programistów bez dobrego powodu.


Drugi punktor jest nieprawidłowy. Twój post w kilku miejscach jest wewnętrznie sprzeczny.
— Markiz Lorne

@EJP Drugi punkt jest bardziej z mojego doświadczenia, ale czy masz przykład, który kompiluje się w JDK 8 z, -source 7ale się nie kompiluje -source 8? Czy mógłbyś również wskazać sprzeczności, ponieważ twój komentarz nie jest zbyt konstruktywny jako taki…
— Didier L,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.