Czy programiści Java powinni wiedzieć o algorytmach wyrzucania elementów bezużytecznych? [Zamknięte]

11

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ć?

Maniak
źródło
1
Tak, powinni. W przeciwnym razie grozi im napisanie oprogramowania, które pęka pod dużym obciążeniem.
quant_dev

Odpowiedzi:

9

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ą?

Sokół
źródło
7

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ę.

JohnMcG
źródło
2
Znając zrozumienie podstaw, z którymi się zgodziłbym (zrozumienie rzeczy czyni cię lepszym programistą). Problem polega na tym, że jeśli znasz skomplikowane szczegóły, a następnie use that informationzaprojektujesz 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.
Martin York,
Myślałem bardziej zgodnie z tym, że jeśli wiesz coś o tym, jak Stringjest zaimplementowany, to nie połączysz się w łańcuch używając +pętli.
JohnMcG
4

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.

superM
źródło
1
Zgadzam się z (2) i połową (1) (pomaga w debugowaniu). Ale w (1) występują zagrożenia i zaprojektuj swój kod do pracy z określoną implementacją GC, ponieważ nie będzie już optymalny, gdy GC zostanie ulepszony lub przejdziesz do implementacji z innym typem GC.
Martin York,
@Loki Astari, masz rację, że jest niebezpieczny dla określonych implementacji. Ale z drugiej strony istnieją rzeczy, które się nie zmieniają (przynajmniej przez długi czas), na przykład zasady śmieci w .NET.
superM
@ superM: W rzeczywistości GC Mono znacznie różni się od GC Microsoftu i jest w trakcie zastępowania go innym całkowicie innym.
Jörg W Mittag
@ superM: Nie wygląda mi to tak wolno na ewolucję Javy: en.wikipedia.org/wiki/Java_version_history (wygląda na to, że raz w roku pojawia się nowa łatka lub aktualizacja). Dzięki nowej wersji w przyszłym roku. To nie znaczy, że GC jest aktualizowana za każdym razem, ale pokazuje potencjał.
Martin York,
@Loki Astari, zgadza się. Wiele w rozwoju oprogramowania ciągle się zmienia, a naszym zadaniem jest nadążanie za nim. Poza tym wszystkie zmiany są oparte na tym, co już istnieje, więc nie spodziewałbym się radykalnych zmian w 1 lub 2 wersjach.
superM
4

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 ).

TMN
źródło
3

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.

Michael Kohne
źródło
1

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.

perdian
źródło