Middle+
Jakie cechy ma garbage collector w Dart?
sobes.tech AI
Odpowiedź od AI
Garbage collector w Dart używa algorytmu Generational Garbage Collection.
Główne cechy:
- Generacje: Obiekty dzielą się na dwie generacje:
- Generacja młoda: Tu tworzone są nowe obiekty. Zbiórka w tej generacji jest szybsza i częstsza, ponieważ większość obiektów umiera niedługo po utworzeniu.
- Generacja stara: Obiekty, które przetrwają kilka cykli zbiórki w generacji młodej, są przenoszone tutaj. Zbiórka w tej generacji jest rzadsza, ale trwa dłużej.
- Obiekty żyjące: Obiekty w generacji młodej, na które wskazują inne obiekty, są uważane za "żyjące" i mogą być przeniesione do generacji starej.
- Etapy zbiórki:
- Minor GC: Szybka zbiórka obejmująca tylko obiekty w generacji młodej.
- Major GC: Dłuższa zbiórka sprawdzająca obiekty w generacji starej.
- Zalety generacyjnej zbiórki:
- Optymalizacja dla obiektów krótkotrwałych: Większość śmieci jest szybko usuwana z generacji młodej.
- Skracanie czasów przerw: Częste, krótkie przerwy na zbiórkę młodej generacji są mniej zauważalne niż rzadkie, ale długie przerwy na całą stertę.
- Garbage collector Dart VM:
- Używa hybrydowego podejścia, łączącego kopiowanie (copying collector) dla generacji młodej i oznaczanie i zagęszczanie (mark-and-sweep/compact) dla generacji starej.
- Kopiujący zbieracz w generacji młodej szybko przenosi żywe obiekty do innego obszaru pamięci, efektywnie zwalniając aktualny.
- Oznaczanie i zagęszczanie w generacji starej znajduje żywe obiekty i je przenosi, aby wyeliminować fragmentację pamięci.
- Działa niezależnie od wątków interfejsu użytkownika, minimalizując blokady.
// Przykład tworzenia obiektów, które trafią do generacji młodej
class MyClass {
String name;
MyClass(this.name);
}
void main() {
var obj1 = MyClass("Obiekt 1"); // Tworzone w generacji młodej
var obj2 = MyClass("Obiekt 2"); // Tworzone w generacji młodej
// Jeśli obiekty nie są utrzymywane przez referencje, mogą zostać zebrane
// podczas następnej zbiórki w generacji młodej.
// Jeśli te obiekty będą żyły długo i będą miały referencje,
// mogą zostać przeniesione do generacji starej.
}