To bardzo kłopotliwe pytanie i wydaje mi się, że wiele osób sprzeciwia się Javie, pomimo tego, jak użyteczny jest ten język.
Fakt, że nie można ufać, że „System.gc” zrobi cokolwiek, jest niezwykle zniechęcający i łatwo wywołuje w języku uczucie „strachu, niepewności, wątpliwości”.
W wielu przypadkach miło jest radzić sobie ze skokami pamięci, które celowo wywołujesz, zanim nastąpi ważne zdarzenie, które sprawi, że użytkownicy będą myśleć, że Twój program jest źle zaprojektowany / nie odpowiada.
Umiejętność kontrolowania wyrzucania elementów bezużytecznych byłaby bardzo doskonałym narzędziem edukacyjnym, co z kolei poprawiłoby zrozumienie ludzi, jak działa wyrzucanie elementów bezużytecznych i jak programy wykorzystują to zachowanie domyślne i kontrolowane.
Pozwól mi przejrzeć argumenty tego wątku.
- Jest nieefektywny:
Często program może nic nie robić i wiesz, że nic nie robi ze względu na sposób, w jaki został zaprojektowany. Na przykład może to być coś w rodzaju długiego oczekiwania z dużym oknem komunikatu oczekiwania, a na końcu równie dobrze może dodać wezwanie do zbierania śmieci, ponieważ czas jego uruchomienia zajmie naprawdę niewielki ułamek czasu długo czekać, ale pozwoli uniknąć działania gc w trakcie ważniejszej operacji.
- Jest to zawsze zła praktyka i wskazuje na uszkodzony kod.
Nie zgadzam się, nie ma znaczenia, jaki posiadasz śmieci. Jego zadaniem jest śledzenie śmieci i ich czyszczenie.
Dzwoniąc do gc w czasach, gdy użycie jest mniej krytyczne, zmniejszasz prawdopodobieństwo jego uruchomienia, gdy twoje życie zależy od uruchomionego określonego kodu, ale zamiast tego decyduje się na zbieranie śmieci.
Jasne, może nie zachowywać się tak, jak tego chcesz lub się spodziewasz, ale kiedy chcesz to nazwać, wiesz, że nic się nie dzieje, a użytkownik jest skłonny tolerować spowolnienie / przestoje. Jeśli plik System.gc działa, świetnie! Jeśli nie, przynajmniej spróbowałeś. Po prostu nie ma wad, chyba że śmieciarz ma nieodłączne skutki uboczne, które powodują coś okropnie nieoczekiwanego w stosunku do zachowania się śmieciarza, jeśli zostanie wywołany ręcznie, a to samo w sobie powoduje brak zaufania.
- To nie jest powszechny przypadek użycia:
Jest to przypadek użycia, który nie może być osiągnięty w sposób niezawodny, ale mógłby mieć miejsce, gdyby system został zaprojektowany w ten sposób. To tak, jakby zrobić sygnalizację świetlną i sprawić, aby niektóre / wszystkie przyciski sygnalizacji świetlnej nic nie robiły. To sprawia, że zastanawiasz się, dlaczego ten przycisk jest na początek, javascript nie ma funkcji usuwania śmieci, więc nie nie analizuj tego za to.
- Specyfikacja mówi, że System.gc () jest wskazówką, że GC powinien uruchomić, a maszyna wirtualna może go zignorować.
co to jest „wskazówka”? co to jest „ignorować”? komputer nie może po prostu przyjmować wskazówek ani niczego ignorować, istnieją ścisłe ścieżki zachowania, które mogą być dynamiczne, które są kierowane intencją systemu. Prawidłowa odpowiedź obejmowałaby to, co tak naprawdę robi śmieciarz, na poziomie implementacji, co powoduje, że nie wykonuje on zbierania danych na żądanie. Czy ta funkcja jest po prostu niedostępna? Czy są jakieś warunki, które muszę spełnić? Jakie są te warunki?
W tej chwili GC Javy często wygląda jak potwór, któremu po prostu nie ufasz. Nie wiesz, kiedy to przyjdzie lub odejdzie, nie wiesz, co się stanie, jak to zrobi. Mogę sobie wyobrazić, że niektórzy eksperci mają lepsze pojęcie o tym, jak działa ich odśmiecanie według instrukcji, ale zdecydowana większość po prostu ma nadzieję, że „po prostu działa”, i że trzeba ufać nieprzejrzystemu algorytmowi, który wykona pracę dla ciebie, jest frustrujący.
Istnieje duża luka między czytaniem o czymś lub uczeniem się czegoś, a faktycznym widzeniem jego realizacji, różnicami między systemami i możliwością grania bez konieczności patrzenia na kod źródłowy. To stwarza pewność siebie i poczucie opanowania / zrozumienia / kontroli.
Podsumowując, istnieje nieodłączny problem z odpowiedziami: „ta funkcja może nic nie robić i nie będę wchodził w szczegóły, jak powiedzieć, kiedy coś robi, a kiedy nie, i dlaczego nie zrobi lub nie, często sugeruje, że próba zrobienia tego jest po prostu sprzeczna z filozofią, nawet jeśli intencja jest uzasadniona ”.
Może być w porządku, aby Java GC zachowywała się w ten sposób, lub nie, ale aby to zrozumieć, trudno jest naprawdę podążać w jakim kierunku, aby uzyskać kompleksowy przegląd tego, co możesz zaufać GC i nie robić, więc zbyt łatwo jest po prostu nie ufać językowi, ponieważ celem języka jest kontrolowane zachowanie do filozoficznego stopnia (dla programisty, szczególnie początkującego, łatwo popadnie w kryzys egzystencjalny z powodu pewnych zachowań systemowych / językowych) są w stanie tolerować (a jeśli nie możesz, po prostu nie będziesz używać języka, dopóki nie będziesz musiał), a więcej rzeczy, których nie możesz kontrolować bez żadnego znanego powodu, dla którego nie możesz ich kontrolować, jest z natury szkodliwe.