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.
źródło
Odpowiedzi:
Jeśli dobrze rozumiem pytanie, chcesz wiedzieć, czy kod bajtowy wygenerowany przez
javac
bę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
javac
mię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 najavac
bardziej poprawne śledzenie JLS i nie będzie żadnych "ulepszeń" w kodzie bajtowym.źródło
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.
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
invokedynamic
którego dodano lambdy, istniało w Javie 7, ale po prostu nie było używane w ten sposób.źródło
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:
Krótko mówiąc: istnieje kilka subtelnych zalet i pewne ryzyko (gdzie znaczenie ryzyka zależy głównie od ogólnej konfiguracji).
źródło
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:
aby zachować nazwy parametrów metod.
Opcja zwana kompaktowym profilem zapewniająca mniejszą powierzchnię.
źródło
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:
-source 7
z javac);-source 7
zamiast,-source 8
jeśli kompilujesz z JDK 8, a docelowym środowiskiem wykonawczym jest Java 8;-source 8
gwarancji, ż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.
źródło
-source 7
ale się nie kompiluje-source 8
? Czy mógłbyś również wskazać sprzeczności, ponieważ twój komentarz nie jest zbyt konstruktywny jako taki…