Есть ли польза от обновления скомпилированного кода Java 7 до Java 8?

127

У меня есть старое приложение, написанное на Java 7. Оно отлично работает в Java 8 JRE. Я не планирую переписывать какой-либо код, чтобы использовать функции Java 8. Есть ли какие-либо технические преимущества в обновлении скомпилированного кода до последней версии Java 8 JDK?

Чтобы было ясно, код в настоящее время скомпилирован с Java 7 и уже работает с последней версией Java 8 JRE. Он уже должен извлечь выгоду из улучшений среды выполнения Java 8. Этот вопрос заключается в том, можно ли получить какие-либо преимущества от компиляции с версией 8 и запуска с компилированным байтовым кодом Java 8.


Кроме того, меня не интересуют нетехнические преимущества, такие как продуктивность разработчика. Я думаю, это важно, но не в этом вопрос. Я прошу ради производственного кода, у которого НЕТ команды разработчиков. Это чисто в режиме обслуживания.

g8torPaul
источник
2
Просто быть чистым. Код уже работает с последней версией 1.8 JRE и, следовательно, содержит все последние исправления ошибок Java 8 и улучшения производительности во время выполнения (насколько мне известно).
g8torPaul 02
4
Вероятно, это вопрос больше о байт-коде, выводимом компилятором. Может быть, проясните это в своем вопросе.
M
2
Значит, повышение продуктивности разработчиков здесь не актуально?
Mick Mnemonic
7
Как может быть непонятным «Я не планирую переписывать какой-либо код», я не могу поверить.
ELDO
3
Это может быть несколько связано: stackoverflow.com/questions/21732290/…
Арно

Ответы:

82

Если я правильно понял вопрос, вы хотите знать, будет ли создаваемый байт-код javac«лучше» в Java 8, чем в Java 7.

Ответ, вероятно, нет, они постоянно исправляют ошибки в компиляторе, и это иногда приводит к более эффективному байт-коду. Но вы не увидите значительного ускорения от этих исправлений для Java 8, насколько я могу судить, в журнале изменений перечислены только 2 основных изменения между версиями.

Веб-сайт оракула ужасен, и я не могу получить список исправлений, связанных с javacмежду версиями, но вот неполный из OpenJDK . Большинство из них, которые мне удается найти, исправляют ошибки. Таким образом, при обновлении до Java 8 есть вероятность, что он больше не будет компилироваться из-за javacболее правильного следования JLS, и в байт-коде будет очень мало «улучшений» или вообще не будет.

Андрей
источник
4
Спасибо, я просмотрел часть списка на OpenJDK, и в нем нет ничего особенного, кроме того, что, похоже, они улучшили производительность javac. Я согласен с тем, что практически невозможно провести разумный поиск исправлений / функций между версиями Java на веб-сайте Oracles. Формат примечаний к выпуску для каждой версии даже не согласован. Моя интуиция подсказывает мне, что компиляция с JDK 8 и JDK 7 не
дает
1
@ g8torPaul, если вы не собираетесь использовать функции, доступные только в Java 8, например lamdbas / streams
Питер Лоури
21

Основное преимущество заключается в том, что в Java 8 есть последние исправления ошибок, тогда как Java 7 не обновляется публично.

Кроме того, если вы собираетесь запускать код на Java 8 JVM, у вас может быть установлена ​​только одна версия Java.

Java 8 может быть быстрее и лучше поддерживает новые функции, такие как G1. Однако для вашего варианта использования это может быть медленнее, поэтому единственный способ узнать это - протестировать.

Есть ли какие-либо технические преимущества в обновлении скомпилированного кода до последней версии Java 8 JDK?

Если вы спрашиваете, есть ли польза от повторной компиляции кода Java 7 в компиляторе Java 8, ответ будет; почти ничего.

Единственное небольшое отличие состоит в том, что были незначительные отличия от Java API, поэтому могут быть очень тонкие различия, которые компилятор Java 8 может обнаружить, что Java 7

Другие незначительные отличия - это магическое число в начале файла, возможно, порядок пула констант. Байт-код в основном такой же, даже поддержка, invokedynamicкоторая была добавлена ​​для лямбда-выражений, существовала в Java 7, но просто не использовалась таким образом.

Питер Лоури
источник
8
Поправьте меня, если я ошибаюсь, но OP спрашивает о перекомпиляции кода с Java 8, тогда как ваш ответ о том, использовать ли Java 8 для его выполнения?
tobias_k 02
5
В настоящее время я использую последнюю версию Java 1.8 JRE. Все исправления ошибок и внутренний код Java будут предоставлены JRE. Я не думаю, что это решает мой вопрос.
g8torPaul
16
Это просто не отвечает на вопрос. Если "почти ничего", поясните, в чем разница. В противном случае это просто предположение
М. Платвоет
1
@Peter Lawrey, Вы говорите, что "... ответ: почти ничего". Есть ли у нас доказательства, подтверждающие это? Кстати, я бы с вами согласился.
g8torPaul
2
@ g8torPaul Java 8 имеет обратную совместимость с Java 7, и если вы не используете какие-либо функции Java 8, она должна генерировать почти точно такой же байтовый код.
Питер Лоури 02
21

Это может помочь, повышая осведомленность .

При переключении на Java8 вы можете обнаружить, что javac выдает дополнительные предупреждения. Пример: вывод типов был значительно улучшен в Java8. И это может устранить необходимость в аннотациях @SuppressWarnings в вашей текущей кодовой базе (и когда такие аннотации больше не требуются, компилятор предупреждает об этом).

Итак, даже если вы сегодня не собираетесь изменять свою кодовую базу, переход на Java8 может рассказать вам о таких вещах. Расширение ваших знаний может помочь в принятии обоснованных решений.

С другой стороны:

  • Я видел здесь несколько вопросов о (редких) ситуациях, когда Java8 отказывался компилировать код Java7. Таким образом, переход на Java8 также несет (минимальный) риск столкнуться с подобными проблемами.
  • И: даже если вы не собираетесь трогать свою кодовую базу сегодня , есть определенная вероятность, что вы передумаете позже. А затем, когда вы не обращаете внимания, вы можете использовать возможности Java8. Что могло усложнить «полевые обновления»; поскольку теперь вам нужно поддерживать две версии исходного кода!
  • Затем: в случае, если у вас есть клиенты, использующие продукт, использующий java7 jre; вы должны быть очень осторожны с бинарными исправлениями, которые вы им предоставляете. У нас есть такая установка; и я не раз тратил время зря, потому что случайно поместил один скомпилированный Java8 класс в тестовую систему, управляемую Java7. Этого просто не может произойти, когда ваш разработчик и тестовая / клиентская установка - это все Java7.

Короче говоря: есть несколько тонких преимуществ и определенные риски (где значимость рисков в основном зависит от вашей общей настройки).

GhostCat
источник
2
Один из примеров такой редкой проблемы «Java8 отказался компилировать Java7»: stackoverflow.com/q/41590024/2513200 (известная проблема компилятора Oracle, затрагивающая только Java 8, но не 7 или 9)
Халк,
8

Я бы сделал хотя бы по этим фактам.

1) Внутренности HashMap (быстрее под jdk-8)

2) Исправлено множество ошибок, которые могут быть прозрачными для вас (оптимизация времени выполнения), которые сделают ваш код быстрее и лучше, даже если вы на самом деле ничего не сделаете.

3) Сборщик мусора G1

РЕДАКТИРОВАТЬ

С технической точки зрения это больше похоже на что-то, связанное с Ahead of Time Compilation или что-то, что компилятор может улучшить, больше анализируя код. Насколько я знаю, в компиляторе java 8 такие вещи не выполняются.

С точки зрения разработчика - их много. Повышение продуктивности - это для меня самое главное.

ИЗМЕНИТЬ 2

Я знаю только два момента, которые соответствуют вашему второму запросу:

-параметров

чтобы сохранить имена параметров метода.

-профиль

Называется вариант компактного профиля для меньшей занимаемой площади.

Евгений
источник
26
Но разве простая работа под Java 8 не дала бы эти преимущества? Настоящий вопрос, по-видимому, заключается в следующем: «Могу ли я написать на Java 8 что-нибудь, что работает лучше, чем эквивалент Java 7».
Йорн Верни
8
В настоящее время я использую последнюю версию Java 1.8 JRE. Все исправления ошибок и внутренний код Java будут предоставлены JRE. Сборщик мусора также является частью JRE. Я не думаю, что это решает мой вопрос.
g8torPaul
8
Операторы @JornVernee прямо сказали, что он не хочет ничего переписывать, поэтому вопрос, насколько я понимаю, больше похож на «может ли компилятор Java 8 выполнять какие-либо трюки, которые компилятор Java 7 не может делать»
tobias_k
2
@JornVernee Вопрос в том, если код, написанный на Java 7 и скомпилированный на Java 8, работает лучше, чем код, скомпилированный на Java 7
EarlGrey
6
Не отвечает на вопрос и просто предполагает, что ситуация не улучшилась.
M
-1

Если у вас нет других причин для перекомпиляции приложения, то это, вероятно, не имеет большого значения, как указано в принятом ответе.

Однако, если вам нужно перекомпилировать его хотя бы один раз, учтите следующее:

  • Исходный код вашего приложения совместим с Java 7 и, скорее всего, 8 тоже;
  • Если код не компилируется с Java 8, он, вероятно, не будет компилироваться ни с компилятором Java 8 в режиме совместимости -source 7с исходным кодом Java 7 ( с javac);
  • Ваши разработчики и CI должны будут запускать модульные и интеграционные тесты для среды выполнения Java 8, чтобы быть как можно ближе к производственной среде. Разработчикам также потребуется запускать приложение в той же среде выполнения Java 8 при его локальном запуске;
  • Скомпилировать с JDK 7 и запустить с JRE 8 (в том же процессе сборки или в той же среде IDE) труднее, чем делать все с той же версией;
  • Нет никаких преимуществ от использования -source 7вместо, -source 8если вы компилируете с JDK 8 и ваша целевая среда выполнения - Java 8;
  • Использование -source 8гарантий того, что разработчик использует Java 8 (или новее) как для компиляции, так и для времени выполнения (в соответствии с требованиями -target 8).

В заключение, не перекомпилируйте его, если вам это не нужно. Однако в первом случае вам придется перекомпилировать (из-за изменений кода) переключиться на Java 8. Не рискуйте получить ошибку из-за несоответствия среды и не ограничивайте разработчиков без уважительной причины.

Дидье Л
источник
Второй маркер неверен. Ваш пост противоречив в нескольких моментах.
Маркиз Лорн
@EJP Второй пункт - это больше из моего опыта, но есть ли у вас пример, который компилируется в JDK 8, -source 7но не компилируется -source 8? Кроме того, не могли бы вы указать на противоречия, так как ваш комментарий не очень конструктивен как таковой…
Дидье Л.