Zarówno Windows Phone / Xbox, jak i Android nie obsługują generowania śmieci w trybie pokoleniowym. Jest to frustrujące dla wielu programistów. Wydaje się, że jest to uzasadniony powód techniczny, ale nie mogę tego rozgryźć.
Obecne telefony mają więcej pamięci i prawdopodobnie lepsze procesory niż komputery stacjonarne / laptopy z systemem .NET 1.1 z generacyjnym GC w 2001 roku, i nie mogę wymyślić żadnych powodów, dla których procesory ARM byłyby gorsze w generacyjnym GC niż x86. Istnieje również mniejsze zapotrzebowanie na wielozadaniowość na telefonach i konsolach, więc jest stosunkowo więcej wolnego miejsca na stosie.
Co więc daje?
Edycja: Kilka punktów do wyjaśnienia:
- Platformy te używają wyrzucania elementów bezużytecznych wyłącznie do aplikacji, więc moje pytanie nie dotyczy tego, dlaczego GC nie jest obsługiwane; moje pytanie dotyczy tego, dlaczego generowanie śmieci nie jest generowane .
- Powodem, dla którego ludzie są sfrustrowani brakiem pokoleniowej GC, jest to, że GG niegenracyjna jest niezwykle nieefektywna. (Oznacza to, że żywotność baterii nie jest powodem.)
- Wierzę, że istnieje uczciwy techniczny powód braku generacyjnego wsparcia GC. To nie jest pytanie retoryczne.
java
.net
android
windows-phone-7
garbage-collection
Rei Miyasaka
źródło
źródło
Odpowiedzi:
Myślę, że największym problemem jest żywotność baterii. Wyrzucanie elementów bezużytecznych to wygoda dla programistów kupiona za cenę dodatkowych cykli procesora na komputerze użytkownika . Gdy procesor jest podłączony (komputer stacjonarny) lub ma stosunkowo dużą baterię (laptop), użytkownicy są bardziej skłonni płacić za wygodę programistów dodatkową energią zużywaną przez procesor podczas usuwania śmieci. Gdy bateria jest stosunkowo mała, użytkownicy mogą nie być tak hojni. Mogą chcieć dla siebie tego dodatkowego baru - być może porozmawiać z przyjaciółmi lub zabić kilka dodatkowych świń podczas śmiertelnego spotkania ze złymi ptakami.
Bez względu na powody użytkowników programiści systemów operacyjnych nie chcą tworzyć wrażenia, że urządzenia z systemem operacyjnym wyczerpują baterię szybciej niż urządzenia z systemem konkurencji. Kupują więc lepsze postrzeganie oczekiwanego czasu pracy baterii swoich urządzeń w cenie wygody programistów: dla nich Twój ból nie jest niczym, o ile użytkownicy są zadowoleni z urządzeń.
źródło
Domyślam się, że nie jest to powód techniczny, ale że programiści tych platform telefonicznych po prostu jeszcze nie włożyli wysiłku. Wiem, że nie jest to odpowiedź, na którą liczysz, ale jeśli wykonałeś jakiś rozwój mobilny, prawdopodobnie zauważyłeś, że jest dużo nisko wiszących owoców. Prawdopodobnie po prostu nie mieli czasu na napisanie wielu implementacji GC, dostrojenie ich wszystkich i wybranie tej, która najlepiej sobie radzi. Dlaczego ktoś miałby spędzać czas na nowo opracowując koło, kiedy zamiast tego mógł wypuszczać nowe, krzykliwe, źle przemyślane interfejsy API? ;)
FWIW i jako potwierdzenie mojej teorii, nowy środowisko uruchomieniowe Androida (ART) ma generacyjny GC i planuje w przyszłości kompaktować GC .
źródło
Istnieje generowanie dodatkowych kosztów związanych z generowaniem śmieci.
Kolektor generacyjny musi być w stanie dowiedzieć się, kiedy starsze obiekty wskazują nowe obiekty. Nie możemy prześledzić starszego obiektu w celu znalezienia tych przypadków, ponieważ byłoby to sprzeczne z celem gromadzenia pokoleń. Zamiast tego musimy jakoś wykryć, kiedy to nastąpi, i zanotować to na etapie gromadzenia. Niezależnie od tego, jak to zrobisz, spowoduje to dodatkowe obciążenie procesu zbierania.
W systemie stacjonarnym Twój system operacyjny zajmuje się różnymi rzeczami z pamięcią za kulisami. Obsługuje takie funkcje, jak współdzielenie stron między procesami, zapisywanie nieużywanych stron na dysku, zapewnianie mapowania pamięci między procesami itp. Rozumiem, że niektóre z wykorzystywanych tam funkcji umożliwiają bardziej efektywne śledzenie zmienianych wskaźników. Operacja już martwi się tym, co zmieniasz w pamięci, więc wykorzystanie tych informacji do nowych celów nie stanowi problemu.
Podejrzewam, że systemy mobilne nie robią tych samych rzeczy za kulisami. W rezultacie nie mają takiego samego poziomu informacji, jaki miałby pulpit. W rezultacie narzut związany z wdrożeniem ogólnej kolekcji jest wyższy i mniej prawdopodobne, że będzie tego wart.
źródło