7

Niektóre nowsze języki wdrażają ARC w swoich kompilatorach (Swift i Rust, żeby wymienić parę). Rozumiem, że osiąga się to samo, co GC w czasie wykonywania (odciążenie ręcznej alokacji od programisty), a przy tym jest znacznie wydajniejsze.Jaka jest zaleta GC środowiska wykonawczego w porównaniu z protokołem ARC w czasie kompilacji?

Rozumiem, że ARC może stać się złożonym procesem, ale ze złożonością nowoczesnych śmieciarek wydaje się, że wdrożenie ARC nie byłoby bardziej skomplikowane. Jednak wciąż jest mnóstwo języków i frameworków używających GC do zarządzania pamięcią, a nawet język Go, który jest przeznaczony do programowania systemów, używa GC.

Naprawdę nie mogę zrozumieć, dlaczego GC byłaby lepsza od ARC. Czy coś mi umyka?

Odpowiedz

20

Jest tu wiele kompromisów, to skomplikowany temat. Oto te duże ale:

GC plusy:

  • Kalka śmieciarze mogą obsługiwać cykli na wykresach obiektów. Automatyczne liczenie odniesień spowoduje wyciek pamięci, chyba że cykle zostaną ręcznie przerwane przez usunięcie odniesienia lub ustalenie, która krawędź wykresu powinna być słaba. Jest to dość powszechny problem w praktyce w liczonych aplikacjach.
  • Tracing garbage collectors może rzeczywiście być umiarkowanie szybsze (pod względem przepustowości) niż liczenie odwołań, przez wykonywanie pracy jednocześnie, przez grupowanie pracy, przez odraczanie pracy i przez nie zmyślanie pamięci podręcznych dotykających liczników referencji w gorących pętlach.
  • kolektory Kopiowanie może kompaktowania sterty, odzyskanie pofragmentowane stron w celu zmniejszenia emisji dwutlenku

ARC Plusy:

  • Ponieważ zniszczenie obiektu dzieje się natychmiast, gdy liczba odniesienia uderza 0, wcieleń przedmiot mogą być wykorzystywane do zarządzania zasoby niepamięci. W przypadku zbierania śmieci okresy życia są niedeterministyczne, więc nie jest to bezpieczne.
  • praca Collection jest zazwyczaj bardziej rozłożone, co skutkuje znacznie krótszych przerw (to jest nadal możliwe, aby uzyskać pauzę jeśli deallocate dużą podgrafu obiektów)
  • Ponieważ pamięć jest zbierany synchronicznie, to nie jest możliwe, aby „uciec kolektor "przydzielając szybciej, niż może posprzątać. Jest to szczególnie ważne, gdy w grę wchodzi VM stronicowanie, ponieważ zdarzają się zdegenerowane przypadki, w których wątek GC trafia na stronę, która została stronicowana, i jest daleko w tyle.
  • W podobnej notatki, kalka śmieciarze chodzić cały wykres obiektu, który wymusza niepotrzebne page-iny (istnieją zmniejszania zagrożenia dla tego jak https://people.cs.umass.edu/~emery/pubs/f034-hertz.pdf, ale nie są one powszechnie stosowane)
  • Tracing śmieciarze zazwyczaj potrzebują więcej „przestrzeni scratch” niż liczenia odniesienia, jeśli chcą uderzyć ich pełna przepustowość

Moje osobiste spojrzenie na to, że tylko dwa punkty, które naprawdę kwestia większości przypadków są:

  • ARC nie zbiera cykle
  • GC nie posiada deterministyczne wcieleń

czuję, że obie te kwestie są okładzina wyłączniki, ale w braku lepszego pomysłu, po prostu trzeba wybrać, które przerażający problem brzmi gorzej.

+1

Aby uzyskać ogólne porównanie pojęć śledzenia GC w porównaniu z licznikiem odwołań, niniejszy artykuł "Unified Theory of Garbage Collection" pokazuje, w jaki sposób można je postrzegać jako ściśle ze sobą powiązane. Różne optymalizacje i poprawki do każdego podejścia po prostu poruszają się po spektrum, które je łączy: https://www.cs.virginia.edu/~cs415/reading/bacon-garbage.pdf – algal

+0

oh, tak, uwielbiam ten papier: D dzięki za połączenie –