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)
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
1. Dzień pierwszy: tworzenie wydajnego oprogramowania
(trochę teorii na wprowadzenie, potem obsługa JMC i MAT, z pobieżnym przedstawieniem JConsole i JVVM)
- Tworzenie wydajnego oprogramowania (MODUŁ WPROWADZAJĄCY TEORETYCZNY)
a) Różne wymiary wydajności
-
-
- Wydajność obliczeniowa
- Wydajność pamięciowa (RAM footprint)
- Wydajność uruchomienia
- Wydajność skalowania
-
b) Wydajność a użytkownik – subiektywne odczucie wydajności
c) Proces tworzenia wydajnego oprogramowania
-
-
- Analiza wydajności
- Projektowanie a wydajność
- Architektura a wydajność
- Kodowanie a wydajność
- Testowanie a wydajność
- Profilowanie a wydajność
-
d) Co wpływa na wydajność w Javie
- Pomiary wydajności
a) Problemy ze zwiększaniem wydajności
b) Co to jest Benchmarking
-
-
- Sposoby dokonywania pomiarów
- Zalety budowania benchmarków
- Micro-benchmark
- Macro-benchmark
- Problemy wyników pomiarowania
-
c) Czym jest profilowanie aplikacji
-
-
- Wpływ profilowania na wydajność
- Problemy z płaskim profilowaniem
- Zalety narzędzi do profilowania
- Narzędzia do profilowania
- Problemy do zdiagnozowania
- Opis narzędzi
- Obsługa wybranych narzędzi
- JConsole
- Java VisualVM
- JMC (Java Mission Control)
- MAT (Memory Analyzer)
-
2. Drugi dzień szkolenia: wybrane aspekty wielowątkowości
3. Fork-Join API (Java 7)
- Algorytmy dziel i rządź
- ForkJoinPool
- ForkJoinTask
- RecursiveAction
- RecursiveTask
4. Zaawansowana współpraca między wątkami w oparciu o Lock
a) Monitor a Lock (java.util.concurrent.locks)
-
- Lock jako alternatywa synchronized
- Interfejs Lock
- Interfejs ReadWriteLock
b) Gotowe implementacje Lock
-
- ReentrantLock (Lock)
- ReentrantReadWriteLock (ReadWriteLock)
- ReentrantReadWriteLock.ReadLock (Lock)
- ReentrantReadWriteLock.WriteLock (Lock)
c) Współpraca między wątkami na Lock
-
- Interfejs Condition
- Metody interfejsu Lock
- newCondition()
- lock()
- tryLock, tryLock(time, unit)
- unlock()
d) Condition jako alternatywa wait-notify
-
- Bez synchronizacji
- Z wsparciem oczekiwania czasowego
- Z wsparciem grup oczekiwania (wiele condition)
5. Zagrożenia w aplikacjach wielowątkowych
- Ograniczenia cyklu życia wątku
- Metody deprecated klasy Thread
- Livelock
- Brak atomowości wykonania
- Zagrożenia blokowania wątków
- Monitory obiektów Class a własny ClassLoader
- Wyścig (hazard)
- Brak określenia sekcji krytycznej
- Błędne monitory
- Zagłodzenie (starvation)
- Zbyt długie przetrzymywanie blokady
- Problemy priorytetów
- Złe priorytetyzowanie
- Mapowanie priorytetów Java na SO
- Priority Inversion
- Zakleszczenie (deadlock)
6. Wydajność aplikacji wielowątkowych w Javie - best practise
a) Współpraca zamiast odpytywania
b) Ograniczanie blokowania
-
- Dane lokalne wątków
- Dane na stosie
- Parametry funkcji
- Zmienne lokalne
- Minimalizacja sekcji krytycznych
- Blokowanie optymistyczne
- 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
-
- ThreadStackSize
- UseTLAB
- EliminateLocks
- UseBiasedLocking
g) 2 różne maszyny Java - client i server
-
- -client - optymalizacja dla GUI
- -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
-
- Scoped locking
- synchronized
- try-finally + Lock
- Lock z AutoCloseable (od Java 7)
- Strategized locking
- Proxy synchronizujące (np. z Collections)
- Dziedziczenie z nadpisaniem metod
- Interceptory/Aspekty/Dekoratory
- Thread-safe interface
- Fasada (GOF) + synchronizacja
- Spin-lock
- Pętle i operacje CAS klas atomowych
- Double-checked locking
- Problemy na przykładzie Singletona
- Scoped locking
Wzorce współpracy
-
- Observer
- Observable i Observer
- PropertyChangeSupport
- Multicaster - Observer bezpieczny wielowątkowo
- AWTEventMulticaster
- Blocking Queue
- Interfejs BlockingQueue
- Standardowe implementacje BlockingQueue
- Consumer-Producer
- wait-notify
- Kolejki blokujące
- ExecutorCompletionService
- Observer
Wzorce zarządzania wątkami
-
- Thread per request
- Thread.start()
- Własna implementacja Executor
- SwingWorker
- Thread per session
- Timer
- Executors.newSingleThreadExecutor()
- Executors.newSingleThreadScheduledExecutor()
- Rozwiązania SWING i AWT
- EventQueue
- SwingUtilities
- Thread pool
- Executors.newCachedThreadPool()
- Executors.newFixedThreadPool()
- Executors.newScheduledThreadPool()
- Executors.newCachedThreadPool()
- Konstruktor ThreadPoolExecutor
- Thread per request
Wzorce obsługi zdarzeń
-
- Executor (Command-Invoker)
- EventQueue
- SwingUtilities
- SwingWorker
- ThreadPoolExecutor
- ExecutorCompletionService
- Scheduler
- Timer
- ScheduledThreadPoolExecutor
- Executor (Command-Invoker)
Wzorce wywołań asynchronicznych
-
- Future
- Future i podinterfejsy
- FutureTask
- Active Object
- Dla metod bez wyników
- Timer
- EventQueue.invokeLater()
- SwingUtilities.invokeLater()
- Executor + Future
- ThreadPoolExecutor
- ScheduledPoolExecutor
- ExecutorCompletionService
- Dla metod bez wyników
- Half-Sync/Half-Async
- Dla metod bez wyników
- Za fasadą: nowy wątek + Thread.join()
- EventQueue.invokeAndWait()
- SwingUtilities.invokeAndWait()
- Ukrycie za fasadą
- Nowy wątek + Thread.join() i pobranie wyniku
- Executor + Future.get()
- ThreadPoolExecutor
- ScheduledPoolExecutor
- ExecutorCompletionService
- ExecutorService.invokeAny
- Dla metod bez wyników
- Future
Wzorce inicjalizacji
-
- Activator
- Active Object za dynamicznym proxy
- Ograniczenia opakowywanego API
- Acceptor-Connector
- ServerSocket i Socket
- Reactor
- Obsługa Socket w wątku pobrania
- + Strategy dla różnych rodzajów żądań
- Proactor
- Reactor z obsługą Socket w osobnym wątku
- + Dobór strategii w dedykowanym wątku
- Leader-Followers
- Proactor z redukcją przełączania między wątkami
- + Dobór strategii i obsługa w tym samym wątku
- Activator
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ą
-
- Jak działa odśmiecanie pamięci (Garbage Collector)
- Co gwarantuje Garbage Collector?
- Cykl życia obiektu
- Fazy cyklu życia obiektu
- Wyspy obiektów
- Metoda finalize
- Problemy i pułapki
b) Typy referencji a Garbage Collector i proces odśmiecania
-
- SoftReference
- WeakReference
- PhantomReference
c) Wycieki pamięci w Javie
-
- Powody
- Złe praktyki
- Unikanie
d) Garbage Collector - złe praktyki
e) Ograniczanie zajętości pamięci
f) Opcje strojenia Garbage Collector’a
-
- Parametry konfiguracyjne Garbage Collector’a
- Słaba teoria generacji
- Typy odśmiecania
- Minor Collections
- Major Collections
- Generacje obiektów
- Organizacja pamięci w Javie
- Młoda generacja
- Eden
- Survivor Spaces
- Stara generacja
- Pamięć permanentna
- Parametry wydajnościowe Garbage Collector
- Wymiarowanie pamięci (generacji)
- Optymalizacja algorytmu odśmiecania
- Rodzaje GC
- Rodzaje
- Serial Collector (Serial + Serial Old)
- Parallel Collector (Parallel Scavenge + Parallel Old)
- Concurent Collector
- Parallel Copying Collector
- G1 – Garbage First
- Zasady działania
- Preferencje
- Skalowalność
- Strojenie
- Problemy i rozwiązania
- Rodzaje
- Opcje podglądu pracy GC
- Zalecenia przy wyborze GC
- Inne opcje strojenia GC
- Zmiany w Java 8
- Zmiany w Java 9
- Zing jako alternatywa
- Parametry konfiguracyjne Garbage Collector’a