Сборка мусора и JIT-компиляция

Оптимизация кода на Java

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Сборка мусора: основы

Ручное управление памятью (C/C++)

  • Программист явно выделяет и освобождает память
  • Высокий риск утечек памяти

$$

Сборка мусора в Java

  • Автоматическое выделение памяти
  • Автоматическое обнаружение неиспользуемых объектов
  • Автоматическое освобождение памяти
Оптимизация кода на Java

Как работает сборка мусора

  • Маркировка: определение достижимых объектов от корней
  • Очистка: удаление недостижимых объектов

Screenshot 2025-05-11 at 6.58.38 PM.png

Оптимизация кода на Java

Сборка мусора и производительность

Производительность и сборщик мусора

  • Упрощает разработку, но влечёт за собой накладные расходы

$$

Алгоритмы сборки мусора

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

Влияние сборки мусора на производительность

// Bad - Creating many short-lived objects
for (int i = 0; i < 1000000; i++) {
    new Object(); // Immediately becomes garbage
}


// vs. Reusing objects Object obj; for (int i = 0; i < 1000000; i++) { obj = new Object(); // Only one reference }
Оптимизация кода на Java

Код, удобный для сборщика мусора

// Avoid this in performance-critical code
String result = "";
for (int i = 0; i < 100000; i++) {
    result += i; // Creates a new String each time
}


// Better approach StringBuilder builder = new StringBuilder(); for (int i = 0; i < 100000; i++) { builder.append(i); // Reuses the same buffer } String result = builder.toString();
Оптимизация кода на Java

JIT-компиляция

  • Процесс выполнения в JVM:
    • Исходный код Java -> Байткод
    • Байткод -> Интерпретируемое выполнение
    • «Горячие» методы -> Нативный машинный код
  • Оптимизирует часто выполняемый код
Оптимизация кода на Java

Паттерны кода, удобные для JIT

  • Пишите предсказуемый код
// Predictable branches help JIT optimization
if (value > 0) {
    // Code A - frequently taken path
} else {
    // Code B - rarely taken path
}
  • Создавайте небольшие, сфокусированные методы
  • Небольшие, часто вызываемые методы — идеальные кандидаты для инлайнинга
  • Сложный код может оптимизироваться менее эффективно
Оптимизация кода на Java

Итоги

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

Давайте потренируемся!

Оптимизация кода на Java

Preparing Video For Download...