Збирання сміття та компіляція Just-In-Time (JIT)

Оптимізація коду в Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Збирання сміття — основи

Ручне керування пам'яттю (C/C++)

  • Програміст явно виділяє й звільняє пам'ять
  • Схильне до витоків

$$

Збирання сміття в Java

  • Автоматичне виділення пам'яті
  • Автоматичне виявлення непотрібних об'єктів
  • Автоматичне повернення пам'яті
Оптимізація коду в Java

Як працює збирання сміття

  • Mark: визначення досяжних об'єктів від коренів
  • Sweep: видалення недосяжних об'єктів

Скріншот 2025-05-11 о 18:58:38

Оптимізація коду в Java

Збирання сміття та продуктивність

Компроміси продуктивності GC

  • Спрощує розробку, але має наслідки для продуктивності

$$

Алгоритми GC

  • Сучасні JVM пропонують кілька алгоритмів збирання сміття
  • Вибір залежить від вимог застосунку
  • Докладний огляд алгоритмів GC — тут
1 https://www.baeldung.com/jvm-garbage-collectors
Оптимізація коду в Java

Вплив GC на продуктивність

// Погано — створювати багато короткоживучих об'єктів
for (int i = 0; i < 1000000; i++) {
    new Object(); // Одразу стає сміттям
}


// Краще — перевикористовувати об'єкти Object obj; for (int i = 0; i < 1000000; i++) { obj = new Object(); // Лише одне посилання }
Оптимізація коду в Java

GC-дружній код

// Уникайте цього в критично важливому за продуктивністю коді
String result = "";
for (int i = 0; i < 100000; i++) {
    result += i; // Щоразу створює новий String
}


// Кращий підхід StringBuilder builder = new StringBuilder(); for (int i = 0; i < 100000; i++) { builder.append(i); // Перевикористовує той самий буфер } String result = builder.toString();
Оптимізація коду в Java

Компіляція Just-In-Time

  • Процес виконання JVM:
    • Java source -> Bytecode
    • Bytecode -> інтерпретоване виконання
    • Гарячі методи -> машинний код
  • Оптимізує часто виконуваний код
Оптимізація коду в Java

JIT-дружні шаблони коду

  • Пишіть передбачуваний код
// Передбачувані розгалуження допомагають JIT-оптимізації
if (value > 0) {
    // Код A — частий шлях
} else {
    // Код B — рідкісний шлях
}
  • Створюйте компактні, вузько сфокусовані методи
  • Невеликі, часто викликані методи — ідеальні кандидати для inlining
  • Складний код оптимізується менш ефективно
Оптимізація коду в Java

Підсумок

  • Мінімізуйте створення об'єктів у критичних за продуктивністю місцях
  • Пишіть передбачуваний код, що відповідає можливостям JIT-оптимізації
  • Оптимізуйте лише те, що справді важливо, — спершу проведіть профілювання
Оптимізація коду в Java

Давайте потренуємось!

Оптимізація коду в Java

Preparing Video For Download...