← Назад к вопросам

Какие плюсы и минусы JDK 11?

2.3 Middle🔥 121 комментариев
#JVM и управление памятью#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

JDK 11: Плюсы и минусы

История релиза

JDK 11 выпущен в сентябре 2018 года как долгосрочный relase (LTS - Long Term Support). Это одна из самых популярных версий Java.

Временная линия:

  • JDK 9 (сентябрь 2017) - первый модульный релиз
  • JDK 10 (март 2018) - полугодовой релиз
  • JDK 11 (сентябрь 2018) - LTS ← Начало долгосрочной поддержки
  • JDK 12-16 (полугодовые релизы)
  • JDK 17 (сентябрь 2021) - следующий LTS
  • JDK 21 (сентябрь 2023) - текущий LTS

Главные плюсы JDK 11

1. LTS (Long Term Support) - 8+ лет поддержки

Что это значит:

  • Регулярные обновления безопасности
  • Исправления ошибок
  • Стабильность для production
# Долгосрочная поддержка до сентября 2026
JDK 11 LTS: Sept 2018 - Sept 2026
Это идеально для enterprise приложений

Практический плюс: не нужно срочно обновляться до следующей версии.

2. HTTP/2 Client API

Новое: встроенный HTTP/2 клиент (стабильный API).

import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

// Раньше: использовали Apache HttpClient или OkHttp
// Теперь: встроенный API

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.example.com/users"))
    .GET()
    .build();

HttpResponse<String> response = client.send(
    request,
    HttpResponse.BodyHandlers.ofString()
);

String body = response.body();
int statusCode = response.statusCode();

System.out.println("Status: " + statusCode);
System.out.println("Body: " + body);

// Асинхронный запрос
HttpResponse<String> asyncResponse = client.sendAsync(
    request,
    HttpResponse.BodyHandlers.ofString()
).thenApply(resp -> {
    System.out.println("Got response: " + resp.statusCode());
    return resp;
}).join();

Минусы этого API: менее гибкий, чем Apache HttpClient (например, нет автоматического retry).

3. Модульная архитектура (JPMS)

Что это: Java Platform Module System (модули вместо классов).

// module-info.java
module com.example.app {
    requires java.base;
    requires java.net.http;
    
    exports com.example.api;
    exports com.example.services;
    
    // Прячем реализацию
    // com.example.impl не экспортируется
}

// Пример использования
public class ApiService {
    // Видно из других модулей (exported)
    public void fetchData() { }
}

// impl.ModuleImpl
// Невидно из других модулей (не exported)
class ModuleImpl { }

Плюсы модулей:

  • Явные зависимости
  • Изоляция реализации
  • Меньший размер JRE (можно создать custom JRE)
# Создание custom JRE только с нужными модулями
jlink --module-path $JAVA_HOME/jmods \
      --add-modules java.base,java.net.http \
      --output my-jre

# Размер: ~30MB вместо стандартных ~150MB

Минусы модулей:

  • Сложность (не нужны для простых приложений)
  • Много миграции старого кода
  • Spring и другие frameworks долго адаптировались

4. Local Variable Type Inference (var keyword)

Что это: автоматический вывод типа локальной переменной.

// Java 10+ (добавлен в JDK 10, но JDK 11 стабилизирует)

// Раньше:
Map<String, List<String>> users = new HashMap<>();
Iterator<User> iterator = users.iterator();

// Теперь:
var users = new HashMap<String, List<String>>();
var iterator = users.iterator();

// Компилятор выводит тип сам
var name = "John";  // String
var count = 10;     // int
var amount = 99.99; // double
var list = new ArrayList<>();  // ArrayList

// Плюсы:
// - Меньше boilerplate
// - Код читаемее
var response = httpClient.send(request, BodyHandlers.ofString());

// Минусы:
// - Может уменьшить читаемость если переменное имя неясно
var x = calculateSomething();  // Что такое x? Неясно!
var result = calculateUserAge(); // Лучше

Best Practice: используй var только если тип очевиден из контекста.

5. Удаление Java EE модулей

Что удалили: модули, которые были в Java EE (теперь Jakarta EE).

// Удалены модули:
// - java.xml.ws (SOAP)
// - java.xml.bind (JAXB)
// - java.activation (JAF)
// - java.corba (CORBA)
// - java.transaction

// Если нужны, добавляй в зависимости:
// Gradle:
dependencies {
    implementation 'javax.xml.bind:jaxb-api:2.3.1'
    implementation 'com.sun.xml.bind:jaxb-impl:2.3.1'
}

// Maven:
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

6. Улучшения в производительности

GC улучшения:

  • ZGC (Z Garbage Collector) - низкие pause times
  • Epsilon GC - no-op GC для тестирования
# Включить ZGC (экспериментально в JDK 11)
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC MyApp

# Epsilon GC (не собирает мусор, для бенчмарков)
java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC MyApp

7. Улучшения в Collections и String

// Новые методы:

// String.repeat()
String repeated = "ab".repeat(3);  // "ababab"

// String.isBlank() и String.strip()
var str = "   hello   ";
if (str.isBlank()) { }        // false
var stripped = str.strip();   // "hello"
var left = str.stripLeading(); // "hello   "
var right = str.stripTrailing(); // "   hello"

// File.readString() и Files.writeString()
String content = Files.readString(Path.of("file.txt"));
Files.writeString(Path.of("file.txt"), "new content");

// Predicate.not() (Java 11)
List<String> nonEmpty = list.stream()
    .filter(Predicate.not(String::isBlank))
    .collect(toList());

8. Single-File Source Launch

Что это: запуск Java файла без компиляции.

# Раньше (Java 10 и ранее):
javac HelloWorld.java
java HelloWorld

# Теперь (Java 11+):
java HelloWorld.java
# Файл компилируется и выполняется в памяти
// HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
# Просто выполняем
java HelloWorld.java  # Output: Hello, World!

Плюсы: удобно для скриптов, обучения, быстрого прототипирования.

Главные минусы JDK 11

1. Модули JPMS слишком сложны для большинства

// Реальная боль в миграции:
// Все open-source библиотеки долго адаптировались
// ClassCastException с модулями - трудно дебажить

// Обход через --add-opens:
java --add-opens java.base/java.lang=ALL-UNNAMED MyApp

2. Удаление Java EE библиотек требует миграции

<!-- Пришлось добавлять явно -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

3. Некоторые фичи ещё экспериментальные

# ZGC в JDK 11 требует флагов
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC MyApp

4. Производительность на холодном старте

Модули добавили overhead на старт.

# Время старта может быть немного больше, чем на JDK 8
time java -version  # ~100ms (vs 50ms на JDK 8)

5. Требует Java 9+ классов для модулей

Если нужны модули - архитектура должна быть спроектирована с начала.

6. Поддержка Spring, Hibernate и т.д. была не идеальной в начале

Много проблем с автоконфигурацией в Spring.

Сравнение: JDK 8 vs JDK 11

ПараметрJDK 8JDK 11
ПоддержкаЗакончилась (кроме Oracle Extended Support)LTS до 2026
МодулиНетДа (опционально)
var keywordНетДа
HTTP/2 ClientНетДа
GCG1GCG1GC, ZGC (experimental)
ПроизводительностьХорошаяЛучше
СложностьПростаяБолее сложная
МиграцияНе требуетсяТребуется
БиблиотекиВстроены (Java EE)Внешние

Практический совет: Использовать ли JDK 11?

Используй JDK 11 если:

  • Новый проект (2019+)
  • Enterprise приложение нужно долгосрочно поддерживать
  • Нужна стабильность и регулярные патчи
  • Используешь Spring Boot 2.1+

Избегай JDK 11 если:

  • Legacy приложение очень привязано к Java EE
  • Требуется максимальная простота (используй JDK 8 LTS)
  • Нужны только экспериментальные фичи (GraalVM, Project Loom)

Сейчас (2026):

  • JDK 11: ещё поддерживается до сентября 2026
  • Рекомендуемая миграция: на JDK 17 LTS или JDK 21 LTS
  • JDK 21 - текущий LTS с поддержкой до 2028

Заключение

JDK 11 - отличный LTS релиз для своего времени:

  • Хорошая точка миграции с JDK 8
  • Новые фичи (var, HTTP/2, String методы)
  • Долгосрочная поддержка
  • Модули для сложных архитектур

Минусы относительно небольшие, если не углубляться в JPMS. Для большинства приложений достаточно просто использовать стандартные классы без явных модулей.