Niedawno zapytano mnie w wywiadzie, czy znam algorytmy zbierania śmieci.
Wiedziałem, czym jest wyrzucanie elementów bezużytecznych, ale tak naprawdę nigdy nie myślałem o nauce algorytmów wyrzucania elementów bezużytecznych, ponieważ jako programista nigdy nie musiałem się tym przejmować, a Garbage Collector wykonuje za mnie całą ciężką pracę.
Czy myślicie, że programiści Java powinni wiedzieć o algorytmach śmieciarek? Jeśli tak, czy możesz mi powiedzieć, na które z nich powinienem spojrzeć?
java
interview
garbage-collection
Maniak
źródło
źródło
Odpowiedzi:
Myślę, że znajomość algorytmów odśmiecania nie jest wcale ważna, jeśli tworzysz „standardowe oprogramowanie”, a nie platformy programowe. Powinieneś mieć podstawową wiedzę na temat działania śmieciarza i to wszystko. Chyba że wystąpią krytyczne opóźnienia w oprogramowaniu spowodowane przez wyrzucanie elementów bezużytecznych lub musisz zoptymalizować wykorzystanie pamięci.
Jeśli interesują Cię te algorytmy, zapoznaj się z moim postem: Jakie są algorytmy za GC z niską pauzą?
źródło
Odśmiecanie jest interesującym, nietrywialnym problemem informatycznym.
Znajomość i zrozumienie algorytmu jest wskazówką, że masz dość głębokie zainteresowanie i zrozumienie tych algorytmów. Nawet jeśli nie studiowałeś algorytmu GC Javy, wywarłoby na mnie wrażenie, gdyby ktoś był w stanie podać rozsądny opis używanych struktur danych i algorytmów.
Jeśli chodzi o programistę Java, dobrze byłoby, gdyby programista mógł opisać zalety i wady GC, co obejmowałoby trochę wiedzy na temat jego implementacji. Wskazywałoby to na zainteresowanie działaniem używanych narzędzi, a nie tylko ich pasywne używanie. Znajomość kosztów pomoże ci również zaprogramować program w sposób minimalizujący koszty.
Nie powiedziałbym, że jest to „wymagana wiedza”, aby zarabiać na życie jako programista Java, ale dodatkowa umiejętność, która pokazuje, że jesteś w stanie i chcesz posunąć się nieco głębiej niż to, co musisz wiedzieć, aby wykonać dzisiejszą pracę.
źródło
use that information
zaprojektujesz swój kod. Może to powodować problemy, ponieważ GC jest ulepszany, a twoje założenia o tym, jak GC już nie utrzymuje, a kod staje się nieoptymalny (aw najgorszym przypadku może utrudnić GC). Warto wiedzieć, ale kod należy projektować z wykorzystaniem najlepszych praktyk, a nie konkretnej implementacji; kompilatory i GC ciągle się poprawiają, a optymalizacje makr ostatecznie nie będą przydatne.String
jest zaimplementowany, to nie połączysz się w łańcuch używając+
pętli.Widzę dwa powody, dla których należy wiedzieć, jak działa moduł czyszczenia śmieci (lub dowolny algorytm / technologia). Oto one:
1. Uzyskasz lepszą wiedzę o tym, co dzieje się pod kodem, który piszesz. Często może to pomóc w napisaniu bardziej wydajnego kodu, co zagwarantuje lepszą wydajność. W niektórych przypadkach może to być niezbędne. (Miałem nieprzyjemne wrażenia, gdy GWT polegał na zbieraczu śmieci w przeglądarce i mieliśmy ogromny wyciek pamięci z Chrome. Musieliśmy więc zobaczyć, co dokładnie spowodowało wyciek).
2. Takie algorytmy są zawsze (lub prawie zawsze nie, zawsze) zaufany inteligentnym, wykwalifikowanym, wykwalifikowanym i doświadczonym programistom. Studiowanie ich podejścia może być bardzo przydatne.
Widzę inny powód, dla którego zadano ci takie pytanie podczas wywiadu. Niektórzy programiści (szczególnie mój były kolega) uważają, że programista nie jest wystarczająco mądry ani pracowity, jeśli nie wie takich rzeczy. Nie zgadzam się z tym stwierdzeniem. Ale tak czy inaczej, wiedza o takich rzeczach jest dobrym sposobem, aby zaimponować swojemu rozmówcy.
źródło
Powinieneś wiedzieć o generowaniu odśmiecania śmieci oraz o szczegółach dotyczących odśmiecania Java (przestrzenie PermGen, Eden i Tenured). Powinieneś także zaznajomić się ze zbieraniem śmieci w ogóle (np. Dlaczego liczenie referencji jest zwykle złym pomysłem i dlaczego lepsza ocena). Poleciłbym również poczytać o niektórych alternatywnych implementacjach (takich jak „bez przerwy” GC w Zing JVM Azul i projekt IBM Metronome w czasie rzeczywistym ).
źródło
Powinieneś mieć NIEKTÓRĄ wiedzę na temat działania funkcji czyszczenia pamięci dla Java z dwóch powodów:
Po pierwsze, jeśli nie wiesz, jak to działa, możesz przypadkowo podjąć decyzje projektowe, które prowadzą do najgorszej wydajności w Twojej aplikacji. Staje się to coraz mniej prawdopodobne w miarę poprawy GC, ale jeśli masz wybór algorytmów w swojej aplikacji, to wiedza o GC oznacza, że możesz wybrać taki, który wie, co zamierza zrobić, zamiast dowiedzieć się, że powoduje to złe zachowanie.
Po drugie, jeśli nie wiesz, jak to działa, nie możesz dostroić GC dla danej aplikacji. Większość programistów Java nigdy nie musi dostrajać GC, ponieważ domyślne parametry działają wystarczająco dobrze przez większość czasu. Jeśli zrobisz coś, co wydostanie się z tego „przez większość czasu”, może się okazać, że dostrajasz parametry GC. Robiąc to bez wiedzy na temat GC, po prostu losowo przekręcasz pokrętła - możesz uzyskać z tego coś pożytecznego, ale bardziej prawdopodobne, że jutro coś spieprzysz.
Tak więc, chociaż nie spodziewałbym się, że dobry programista Java będzie wiedział wszystko pod słońcem o GC, spodziewałbym się, że ten program na pewnym poziomie będzie wiedział, w jaki sposób GC w JVM używają funkcji i jakie są tego kompromisy. Algorytm GC.
źródło
Tak, każdy programista Java powinien zdecydowanie wiedzieć, co dzieje się za kulisami maszyny wirtualnej, co obejmuje także pracę czyszczenia pamięci.
Poziom wiedzy jest jednak kolejnym pytaniem. Nie spodziewałbym się, że normalny programista wytłumaczy różnicę rzeczywistej implementacji (sam bym musiał to zrobić), jednak podstawową zasadą tego, co robi GC i jakie są zalety i wady przeciwko samemu zarządzaniu pamięcią jasny.
źródło