Is Go подвержены тем же тонким утечкам памяти, что и Java?

Вот факты:

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

  • Java имеет сбор мусора

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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