Garbage collection i kompilacja Just-In-Time (JIT)

Optymalizacja kodu w Javie

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

Garbage collection – podstawy

Ręczne zarządzanie pamięcią (C/C++)

  • Programista jawnie alokuje i zwalnia pamięć
  • Podatne na wycieki pamięci

$$

Garbage Collection w Javie

  • Automatyczna alokacja pamięci
  • Automatyczne wykrywanie nieużywanych obiektów
  • Automatyczne odzyskiwanie pamięci
Optymalizacja kodu w Javie

Jak działa garbage collection

  • Oznaczanie: Identyfikacja obiektów osiągalnych z korzeni
  • Zamiatanie: Usuwanie obiektów nieosiągalnych

Zrzut ekranu przedstawiający fazy garbage collection

Optymalizacja kodu w Javie

Garbage collection a wydajność

Kompromisy wydajnościowe GC

  • Upraszcza tworzenie aplikacji, ale wiąże się z kosztami wydajnościowymi

$$

Algorytmy GC

  • Nowoczesne JVM oferują kilka algorytmów garbage collection
  • Wybór zależy od wymagań aplikacji
  • Szczegółowy przewodnik po algorytmach GC dostępny jest tutaj
1 https://www.baeldung.com/jvm-garbage-collectors
Optymalizacja kodu w Javie

Wpływ GC na wydajność

// 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 }
Optymalizacja kodu w Javie

Kod przyjazny GC

// 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();
Optymalizacja kodu w Javie

Kompilacja Just-In-Time

  • Proces wykonania JVM:
    • Kod źródłowy Java -> Bytecode
    • Bytecode -> Wykonanie interpretowane
    • Gorące metody -> Natywny kod maszynowy
  • Optymalizuje często wykonywany kod
Optymalizacja kodu w Javie

Wzorce kodu przyjazne JIT

  • Pisz przewidywalny kod
// Predictable branches help JIT optimization
if (value > 0) {
    // Code A - frequently taken path
} else {
    // Code B - rarely taken path
}
  • Twórz skoncentrowane, małe metody
  • Małe, często wywoływane metody to idealni kandydaci do inliningu
  • Złożony kod może być optymalizowany mniej skutecznie
Optymalizacja kodu w Javie

Podsumowanie

  • Minimalizuj tworzenie obiektów w krytycznych ścieżkach wydajnościowych
  • Pisz przewidywalny kod zgodny z możliwościami optymalizacji JIT
  • Skupiaj optymalizację na tym, co naprawdę ważne – najpierw profiluj
Optymalizacja kodu w Javie

Czas na ćwiczenia!

Optymalizacja kodu w Javie

Preparing Video For Download...