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.

 

Otagowano: