Course Code: jawawyd
Duration: 21 hours
Prerequisites:

Zgodnie z ustaleniami szkolenie posiada wymagania
wstępne dla uczestników:

  • umiejętność programowania w Java
  • znajomość podstaw wielowątkowości w Javie, zarządzania wątkami i zadaniami (Thread, ThreadGroup, Runnable, Callable, ThreadPoolExecutor, Future, Scheduler, synchronizacja i współpraca wait/notify, wielowątkowa praca na kolekcjach)
Overview:

Zgodnie z Państwa wytycznymi odnośnie materiału i czasu szkolenia proponujemy 3 dniowe szkolenie z
wydajności i elementów wielowątkowości, z ogólnymi ramami czasowymi:

  • Dzień 1: Pomiary wydajności (obsługa narzędzi JMC, MAT i przedstawienie JConsole + JVVM)
  • Dzień 2: Wybrane elementy wielowątkowości
  • Dzień 3: Tuningowanie GC
Course Outline:

1.  Dzień pierwszy: tworzenie wydajnego oprogramowania

(trochę teorii na wprowadzenie, potem obsługa JMC i MAT, z pobieżnym przedstawieniem JConsole i JVVM)

  1. Tworzenie wydajnego oprogramowania (MODUŁ WPROWADZAJĄCY TEORETYCZNY)

a) Różne wymiary wydajności 

      1. Wydajność obliczeniowa
      2. Wydajność pamięciowa (RAM footprint)
      3. Wydajność uruchomienia
      4. Wydajność skalowania

b) Wydajność a użytkownik – subiektywne odczucie wydajności

c) Proces tworzenia wydajnego oprogramowania

      1. Analiza wydajności
      2. Projektowanie a wydajność
      3. Architektura a wydajność
      4. Kodowanie a wydajność
      5. Testowanie a wydajność
      6. Profilowanie a wydajność

d) Co wpływa na wydajność w Javie

  1. Pomiary wydajności

a) Problemy ze zwiększaniem wydajności

b) Co to jest Benchmarking

      1. Sposoby dokonywania pomiarów
      2. Zalety budowania benchmarków
      3. Micro-benchmark
      4. Macro-benchmark
      5. Problemy wyników pomiarowania

c) Czym jest profilowanie aplikacji

      1. Wpływ profilowania na wydajność
      2. Problemy z płaskim profilowaniem
      3. Zalety narzędzi do profilowania
      4. Narzędzia do profilowania
        1. Problemy do zdiagnozowania
        2. Opis narzędzi
      5. Obsługa wybranych narzędzi
        1. JConsole
        2. Java VisualVM
        3. JMC (Java Mission Control)
        4. MAT (Memory Analyzer)

2. Drugi dzień szkolenia: wybrane aspekty wielowątkowości

3. Fork-Join API (Java 7)

  1. Algorytmy dziel i rządź
  2. ForkJoinPool
  3. ForkJoinTask
    1. RecursiveAction
    2. RecursiveTask

4. Zaawansowana współpraca między wątkami w oparciu o Lock

a) Monitor a Lock (java.util.concurrent.locks)

    1. Lock jako alternatywa synchronized
    2. Interfejs Lock
    3. Interfejs ReadWriteLock

b) Gotowe implementacje Lock

    1. ReentrantLock (Lock)
    2. ReentrantReadWriteLock (ReadWriteLock)
      1. ReentrantReadWriteLock.ReadLock (Lock)
      2. ReentrantReadWriteLock.WriteLock (Lock)

c) Współpraca między wątkami na Lock

    1. Interfejs Condition
    2. Metody interfejsu Lock
      1. newCondition()
      2. lock()
      3. tryLock, tryLock(time, unit)
      4. unlock()

d) Condition jako alternatywa wait-notify

    1. Bez synchronizacji
    2. Z wsparciem oczekiwania czasowego
    3. Z wsparciem grup oczekiwania (wiele condition)

5. Zagrożenia w aplikacjach wielowątkowych

  1. Ograniczenia cyklu życia wątku
  2. Metody deprecated klasy Thread
  3. Livelock
  4. Brak atomowości wykonania
  5. Zagrożenia blokowania wątków
    1. Monitory obiektów Class a własny ClassLoader
    2. Wyścig (hazard)
      1. Brak określenia sekcji krytycznej
      2. Błędne monitory
    3. Zagłodzenie (starvation)
      1. Zbyt długie przetrzymywanie blokady
      2. Problemy priorytetów
        1. Złe priorytetyzowanie
        2. Mapowanie priorytetów Java na SO
        3. Priority Inversion
    4. Zakleszczenie (deadlock)

6. Wydajność aplikacji wielowątkowych w Javie - best practise

a) Współpraca zamiast odpytywania

b) Ograniczanie blokowania

    1. Dane lokalne wątków
    2. Dane na stosie
      1. Parametry funkcji
      2. Zmienne lokalne
    3. Minimalizacja sekcji krytycznych
    4. Blokowanie optymistyczne
    5. Pamiętaj o kolekcjach współbieżnych

c) Fork-Join granica opłacalności

d) Prawo Amdahla - czyli ograniczenia zrównoleglenia

e) Kontrola ilości wątków - pule wątków

f) Tunning Javy dla wątków

    1. ThreadStackSize
    2. UseTLAB
    3. EliminateLocks
    4. UseBiasedLocking

g) 2 różne maszyny Java - client i server

    1. -client - optymalizacja dla GUI
    2. -server - optymalizacja ogólna

7. Wybrane wzorce wielowątkowości a rozwiązania w Javie

(UWAGA: przedstawione i omówione zostaną jedynie wybrane, jeśli Państwo nie wskażą preferencji, wyboru dokona trener w oparciu o możliwości czasowe, złożoność i przydatność wymienionych niżej rozwiązań; niektóre z poniższych rozwiązań wymagają znajomości pominiętych na tym szkoleniu zagadnień z wielowątkowości)

a) Wzorce blokowania

    1. Scoped locking
      1. synchronized
      2. try-finally + Lock
        1. Lock z AutoCloseable (od Java 7)
    2. Strategized locking
      1. Proxy synchronizujące (np. z Collections)
      2. Dziedziczenie z nadpisaniem metod
      3. Interceptory/Aspekty/Dekoratory
    3. Thread-safe interface
      1. Fasada (GOF) + synchronizacja
    4. Spin-lock
      1. Pętle i operacje CAS klas atomowych
    5. Double-checked locking
      1. Problemy na przykładzie Singletona

Wzorce współpracy

    1. Observer
      1. Observable i Observer
      2. PropertyChangeSupport
      3. Multicaster - Observer bezpieczny wielowątkowo
        1. AWTEventMulticaster
    2. Blocking Queue
      1. Interfejs BlockingQueue
      2. Standardowe implementacje BlockingQueue
    3. Consumer-Producer
      1. wait-notify
      2. Kolejki blokujące
      3. ExecutorCompletionService

Wzorce zarządzania wątkami

    1. Thread per request
      1. Thread.start()
      2. Własna implementacja Executor
      3. SwingWorker
    2. Thread per session
      1. Timer
      2. Executors.newSingleThreadExecutor()
      3. Executors.newSingleThreadScheduledExecutor()
      4. Rozwiązania SWING i AWT
        1. EventQueue
        2. SwingUtilities
    3. Thread pool
      1. Executors.newCachedThreadPool()
      2. Executors.newFixedThreadPool()
      3. Executors.newScheduledThreadPool()
    4. Executors.newCachedThreadPool()
    5. Konstruktor ThreadPoolExecutor

Wzorce obsługi zdarzeń

    1. Executor (Command-Invoker)
      1. EventQueue
      2. SwingUtilities
      3. SwingWorker
      4. ThreadPoolExecutor
      5. ExecutorCompletionService
    2. Scheduler
      1. Timer
      2. ScheduledThreadPoolExecutor

Wzorce wywołań asynchronicznych

    1. Future
      1. Future i podinterfejsy
      2. FutureTask
    2. Active Object
      1. Dla metod bez wyników
        1. Timer
        2. EventQueue.invokeLater()
        3. SwingUtilities.invokeLater()
      2. Executor + Future
        1. ThreadPoolExecutor
        2. ScheduledPoolExecutor
        3. ExecutorCompletionService
    3. Half-Sync/Half-Async
      1. Dla metod bez wyników
        1. Za fasadą: nowy wątek + Thread.join()
        2. EventQueue.invokeAndWait()
        3. SwingUtilities.invokeAndWait()
      2. Ukrycie za fasadą
        1. Nowy wątek + Thread.join() i pobranie wyniku
        2. Executor + Future.get()
          1. ThreadPoolExecutor
          2. ScheduledPoolExecutor
          3. ExecutorCompletionService
        3. ExecutorService.invokeAny

Wzorce inicjalizacji

    1. Activator
      1. Active Object za dynamicznym proxy
      2. Ograniczenia opakowywanego API
    2. Acceptor-Connector
      1. ServerSocket i Socket
    3. Reactor
      1. Obsługa Socket w wątku pobrania
      2. + Strategy dla różnych rodzajów żądań
    4. Proactor
      1. Reactor z obsługą Socket w osobnym wątku
      2. + Dobór strategii w dedykowanym wątku
    5. Leader-Followers
      1. Proactor z redukcją przełączania między wątkami
      2. + Dobór strategii i obsługa w tym samym wątku

3. Trzeci dzień: Tunning GC

UWAGA: ze względu na złożone mechanizmy, wiele różnych GC i multum parametrów, w tym module przeważa teoria nad praktyką. Tuning wymaga dogłębnego zrozumienia jak działa GC i model pamięci w Jawie - nie można naprawiać samochodu, klepiąc na oślep młotkiem i nie wiedząc, co się dzieje pod maską...

8. Zarządzanie pamięcią

a) Java a zarządzanie pamięcią

    1. Jak działa odśmiecanie pamięci (Garbage Collector)
    2. Co gwarantuje Garbage Collector?
    3. Cykl życia obiektu
      1. Fazy cyklu życia obiektu
      2. Wyspy obiektów
      3. Metoda finalize
      4. Problemy i pułapki

b) Typy referencji a Garbage Collector i proces odśmiecania

    1. SoftReference
    2. WeakReference
    3. PhantomReference

c) Wycieki pamięci w Javie

    1. Powody
    2. Złe praktyki
    3. Unikanie

d) Garbage Collector - złe praktyki

e) Ograniczanie zajętości pamięci

f) Opcje strojenia Garbage Collector’a

    1. Parametry konfiguracyjne Garbage Collector’a
      1. Słaba teoria generacji
      2. Typy odśmiecania
        1. Minor Collections
        2. Major Collections
      3. Generacje obiektów
        1. Organizacja pamięci w Javie
        2. Młoda generacja
          1. Eden
          2. Survivor Spaces
        3. Stara generacja
        4. Pamięć permanentna
      4. Parametry wydajnościowe Garbage Collector
      5. Wymiarowanie pamięci (generacji)
    2. Optymalizacja algorytmu odśmiecania
    3. Rodzaje GC
      1. Rodzaje
        1. Serial Collector (Serial + Serial Old)
        2. Parallel Collector (Parallel Scavenge + Parallel Old)
        3. Concurent Collector
        4. Parallel Copying Collector
        5. G1 – Garbage First
      2. Zasady działania
      3. Preferencje
      4. Skalowalność
      5. Strojenie
      6. Problemy i rozwiązania
    4. Opcje podglądu pracy GC
    5. Zalecenia przy wyborze GC
    6. Inne opcje strojenia GC
    7. Zmiany w Java 8
    8. Zmiany w Java 9
    9. Zing jako alternatywa