Подвергается ли Go тем же утечкам памяти, что и Java? - PullRequest
72 голосов
/ 09 декабря 2010

Вот факты:

  • В языке Go есть сборщик мусора.

  • У Java есть сборщик мусора

  • у многих программ на Java есть (утонченные или нет) утечки памяти

В качестве примера Java-программы, у которой есть утечки памяти (не для слабонервных, вопрос может поколебать ваши убеждения), посмотрите здесь о маленькой Java-программе под названием Tomcat, у которой даже есть кнопка «найти утечки»: Есть ли способ избежать утечек памяти при развертывании в Tomcat?

Поэтому мне интересно: будут ли программы, написанные на Go, иметь такие же (тонкие или нет) утечки памяти, которые написаны некоторыми программами?на выставке Java?

Ответы [ 5 ]

41 голосов
/ 09 декабря 2010

Вы путаете различные типы утечек памяти здесь.

Грозные утечки памяти, основанные на явном управлении памятью, исчезли в Java (или любом другом языке, основанном на GC).Эти утечки вызваны полной потерей доступа к частям памяти, не помечая их как неиспользуемые.

«Утечки памяти» все еще присутствуют в Java и на всех других языках на планете, пока компьютер не сможет читать наши мысливсе еще с нами, и будет в обозримом будущем.Эти утечки вызваны тем, что код / ​​программист хранит ссылки на объекты, которые технически больше не нужны.Это в основном логические ошибки, и их нельзя предотвратить ни на одном языке с использованием современных технологий.

18 голосов
/ 09 декабря 2010

Вполне возможно, что программы Go будут иметь утечки памяти.Текущая реализация Go имеет простой сборщик мусора с метками и метками.Это только временное решение, а не долгосрочный сборщик мусора.Смотрите эту страницу для получения дополнительной информации.Посмотри под заголовком Go Garbage Collector.На этой странице даже есть ссылка на код для текущей версии, если вы так склонны.

8 голосов
/ 09 декабря 2010

Сборка мусора или нет, вы можете написать программу с утечками памяти на Java, Go или любом другом языке по большей части.

Сборка мусора снимает с программиста часть бремени, но не полностью предотвращает утечки.

7 голосов
/ 09 декабря 2010

«Утечка памяти» - это когда часть памяти, которая, как думал программист, будет освобождена, не освобождается.Это может произойти на любом языке, мусор или нет.Обычная причина в языках GC - сохранение дополнительной ссылки на память.

"Языки не вызывают утечек памяти, программисты вызывают утечки памяти".

2 голосов
/ 09 декабря 2010

Здесь вы смешиваете уровни абстракции: утечки памяти происходят из-за ошибок в библиотеке (где объекты ссылаются друг на друга, хотя цепочки 'a содержат ссылку на b', а также компромисс в реализации сборщика мусора между эффективностью и точностью. Сколько времени вы хотите потратить на обнаружение таких петель? Если вы потратите вдвое больше, вы сможете обнаружить петли в два раза дольше.

Таким образом, проблема утечки памяти не зависит от языка программирования, нет причины, по которой GO должен быть лучше или хуже, чем Java.

...