Odśmiecanie Grzegorz Timoszuk
Wstęp do GC Pierwsze prace już w latach 60 i 70 Co to jest GC tak naprawdę? Typowe podejście do GC Czemu warto wiedzieć więcej o GC
Gdzie używa się GC a gdzie nie Używa się: Optymalizacja czasu alokacji i zwalniania Wygoda programistów Nie używa się: Pełna kontrola na pamięcią (np. jądro Linuxa) Systemy czasu rzeczywistego Systemy wbudowane
Języki a odśmiecarki C/C++ - Boehm GC RUBY Języki funkcyjne - Lisp Języki obiektowe Smalltalk JAVA
Przegląd algorytmów GC Zaznacz i zamieć 3 kolorowy Zaznacz i zamieć Zaznacz i nie zamiataj Zatrzymaj i kopiuj Zliczanie referencji Odśmiecanie pokoleniowe
Zaznacz i zamieć 2 zbiory Przeglądanie całej pamięci i to 2 razy Zatrzymuje system Słabo wydajne
3-kolorowa wersja 3 zbiory białe/szare/czarne Biali kandydaci do odśmiecenia Czarne puste/bez referacji do białych (zostają) Szare – do przetworzenia Coś typu przechodzenie wszerz z szarych
Zaznacz i nie zamiataj Raz zaczerniony zostaje czarny Biały wolny i może być zwolniony W pewnym momencie wybielanie wszystkiego i wyszukiwanie używanch I tak w kółko
Zliczanie referencji Struktura referencji – np. graf Typowy problem – cykle Inny problem - uaktualnienia Zasadniczo małe wydajne Np. Python
Zatrzymaj i kopiuj 2 przestrzenie z i do Zużywa 2 razy więcej pamięci niż potrzeba Działanie podobne do przechodzenia w głąb Proste w implementacji Algorytm Cheneya
Przenosić czy nie Problem przenoszenia danych w pamięci podczas działania GC, jak przenosić to: Od razu wiadomo ile jest wolnego Bardzo szybko i wygodnie się tworzy obiekty Można optymalizować ustawienie obiektów – np. obiekty często używane po sobie
Pokoleniowy GC Śmiertelność noworodków Podział na generacje Działanie w obrębie generacji i całości (mały i duży cykl) Podejście heurystyczne
Jak to jest w życiu Nie ma jednego idealnego GC Przykład JAVA Ma kilka wbudowanych GC do różnych zastosowań Od JSE 5.0 JVM sam dobiera najlepszy GC do maszyny Możliwości skalowania
GC w Javie Zakłada się, że większość danych zostanie zwolnione szybko po alokacji Nawet mały czas działania GC na 1 procesorze potrafi znacznie wydłużać się w przypadku maszyn wieloprocesorowych
Struktura pamięci
Miary wydajności Mamy dwie najważniejsze miary wydajności GC CZAS PROCESORA STRACONY W GC CZAS PAUZ SYSTEMU
Typy GC w Javie Standardowy – większość aplikacji, najczęściej ustawiany jako domyślny Równoległy – systemy wieloprocesorowe, minimalizuje czas spędzony w GC i pauzy Współbieżny – raczej systemy wieloprocesorowe – krótkie pauzy ponad wszystko
Równoległy GC w Javie
Typowy dla maszyn wieloprocesorowych Od Javy 5.0 update 6 obie fazy mogą być zrównoleglane Priorytety minimalizacji Maxymalny czas pauz Wydajność (% czasu procesora) Footprint
Współbieżny GC Jesteśmy w stanie tracić wydajność na rzecz krótkich pauz Da się stosować już od 2 procesorów – tryb przyrostowy Na GC ok. liczba procesorów/4 w czasie działania Działa na 2 pauzy, druga pauza dłuższa
Współbieżny GC Tryb przyrostowy Zatrzymaj wątki, znajdź osiągalne z korzenia Stwórz graf osiągalnych Jeszcze raz przejdź graf, poszukiwanie zmian z ostatniej chwili Zatrzymaj i sprawdź wszystkie zmiany i uaktualnij dane Współbieżnie wymieć nieużywane Przygotuj się do następnej fazy
Źródła Prezentacja zrobiona w oparciu o szeroko pojęty Internet: Wikipedię ( Dokumentację techniczną do Javy, jest to również źródło grafik prezentacji ( Wesołe obrazki z pakietu MS Office
PYTANIA?? DYSKUSJA!!!