Garbage Collection dla Java
Dwa główne aspekty związane z hostingiem aplikacji, czyli wydajność i cena, są brane pod uwagę przy każdym projekcie. Podstawowe pytanie, stawiane przy dobieraniu rozwiązania do potrzeb brzmi: jak ograniczyć koszty bez wpływu na wydajność aplikacji. Przyjrzyjmy się, w jaki sposób zautomatyzować zarządzanie pamięcią dla aplikacji java hostowanych w UniCloud. Wykorzystamy do tego technologię Java Garbage Collection.
Java Garbage Collection – przegląd
Garbage Collection (GC) służy do automatyzacji zarządzania pamięcią. Jej celem jest wyszukiwanie w pamięci nieużywanych obiektów danych i udostępnienie tej przestrzeni do ponownego użycia. Obiekt, który jest tworzony, alokuje pamięć, która pozostaje do dyspozycji tak długo, jak długo istnieją odniesienia do korzystania z obiektu. Kiedy odniesienia przestają istnieć, uznaje się, że obiekt nie jest potrzebny, a zajmowana przez niego pamięć może zostać odzyskana. Dzięki zwolnieniu pamięci, nie trzeba za nią płacić i koszty używanych zasobów zostają obniżone.
Domyślne ustawienia GC
Wartości domyślne w UniCloud (można je zmienić) są następujące:
- ParNew dla serwerów z zasobami poniżej 8GB
- G1 dla serwerów z zasobami powyżej 8GB (64 cloudlety i więcej)
W tym przypadku nie ma znaczenia, ile cloudletów jest aktualnie używanych. Garbage Collector uwzględnia zadeklarowany limit skalowania- maksymalną ilość cloudletów ustalonych dla każdego serwera.
ParNew Garbage Collector
ParNew jest to wielowątkowy Garbage Collector typu „stop-the-world”. Gromadzi nowe generacje obiektów. Ponieważ zazwyczaj są one niewielkich rozmiarów, ParNew obsługuje jedynie serwery z ograniczeniami poniżej 8GB. Dzięki temu jest bardzo szybki i nie ma wielkiego wpływu na działanie aplikacji. Ponadto ParNew kompaktuje niewykorzystaną pamięć RAM, co umożliwia wsparcie dla automatycznego skalowania poziomego, jednej z czołowych funkcjonalności dostępnych w UniCloud.
Garbage-First Garbage Collector
Garbage-First (G1) GC jest to Garbage Coollector w stylu serwerowym, zaprojektowanym dla wieloprocesorowych maszyn z dużą ilością pamięci. Stos jest dzielony na regiony o stałej wielkości, a G1 śledzi dane w regionach w trybie ciągłym. Jeśli pojawi się konieczność uruchomienia procesu Garbage Collection, najpierw sprzątane są regiony z mniej świeżymi danymi. G1 koncentruje się na aplikacjach, które wymagają dużych stosów z ograniczoną latencją GC. Głęboka analiza wykazała, że 8GB jest wielkością wystarczającą do używania G1.
Aby nieużywaną pamięć RAM zwolnić z JVM do OS, wraz z powyższymi ustawieniami używany jest specjalizowany agent GC.