Oto fakty:
język Go ma zbieracz śmieci.
Java ma kolekcję elementów bezużytecznych
wiele programów Java ma (subtelne lub nie) wycieki pamięci
Jako przykład programu Java, który ma wycieki pamięci (nie dla osób o słabym sercu, pytanie może wstrząsnąć twoimi przekonaniami), zobacz tutaj mały program Java o nazwie Tomcat, który ma nawet przycisk „znajdź przecieki”: Czy jest sposób uniknąć wycieków pamięci po wdrożeniu w Tomcat?
Zastanawiam się więc: czy programy napisane w Go będą wykazywać ten sam rodzaj (subtelnych lub nie) wycieków pamięci, które wykazują niektóre programy napisane w Javie?
java
memory-leaks
go
Składnia T3rr0r
źródło
źródło
memory leak
jest lepsza niż twoja”.Odpowiedzi:
Mylisz tutaj różne rodzaje wycieków pamięci.
Ohydne wycieki pamięci oparte na jawnym zarządzaniu pamięcią zniknęły w Javie (lub jakimkolwiek innym języku opartym na GC). Przecieki te są spowodowane całkowitą utratą dostępu do fragmentów pamięci bez oznaczania ich jako nieużywanych.
„Wycieki pamięci” wciąż obecne w Javie i każdym innym języku na powierzchni planety, dopóki komputer nie będzie w stanie odczytać naszych myśli, wciąż są z nami i będą w dającej się przewidzieć przyszłości. Przecieki te są spowodowane przez kod / programistę przechowującego odniesienia do obiektów, które nie są już technicznie potrzebne. Są to zasadniczo błędy logiczne i nie można im zapobiec w żadnym języku przy użyciu obecnych technologii.
źródło
java.util.logging.Level
który zawiera prywatną statyczną,ArrayList
w której wszystkie takie obiekty są umieszczone na konstrukcji iz którego nigdy nie są usuwane), przez co trudniej jest ich uniknąć przy programowaniu Javy niż w jakimś innym języku, który nie ma takich wadJest bardzo możliwe, że programy Go będą wykazywać wycieki pamięci. Bieżąca implementacja Go ma prostego garbage collectora typu mark-and-sweep. Jest to zamierzone tylko jako rozwiązanie tymczasowe i nie jest przeznaczone jako długoterminowy odśmiecacz. Zobacz tę stronę, aby uzyskać więcej informacji. Spójrz pod nagłówek
Go Garbage Collector
. Ta strona ma nawet link do kodu dla aktualnej wersji, jeśli masz na to ochotę.źródło
„Wyciek pamięci” występuje wtedy, gdy fragment pamięci, który według programisty zostanie uwolniony, nie zostanie zwolniony. Może się to zdarzyć w dowolnym języku, bez względu na to, czy zostały zebrane czy nie. Typową przyczyną w językach GC jest zachowanie dodatkowego odniesienia do pamięci.
„Języki nie powodują wycieków pamięci, programiści powodują wycieki pamięci”.
źródło
Wyrzucanie elementów bezużytecznych, czy nie, możesz napisać program, który w większości przypadków ma wycieki pamięci w Javie, Go lub jakimkolwiek innym języku.
Garbage Collection odciąża programistę, ale nie zapobiega całkowicie wyciekom.
źródło
Mieszasz tutaj poziomy abstrakcji: przecieki pamięci są spowodowane błędami w bibliotece (gdzie obiekty odwołują się do siebie poprzez łańcuchy `` a hold referencja do b ''), a także kompromis w implementacji garbage collectora między wydajnością a dokładność. Ile czasu chcesz poświęcić na znalezienie takich pętli? Jeśli wydasz dwa razy więcej, będziesz w stanie wykryć pętle dwukrotnie dłuższe.
Zatem problem wycieku pamięci nie jest specyficzny dla języka programowania, nie ma powodu, aby GO sam w sobie był lepszy lub gorszy niż Java.
źródło