Вот факты:
в языке Go есть сборщик мусора.
В Java есть сборка мусора
многие программы Java имеют (незаметные или нет) утечки памяти
В качестве примера Java-программы с утечками памяти (не для слабонервных, этот вопрос может поколебать ваши убеждения), посмотрите здесь о небольшой Java-программе под названием Tomcat, в которой даже есть кнопка «найти утечки»: Есть ли способ чтобы избежать утечек памяти в Tomcat?
Поэтому мне интересно: будут ли программы, написанные на Go, демонстрировать такие же (незаметные или нет) утечки памяти, которые обнаруживаются в некоторых программах, написанных на Java?
java
memory-leaks
go
Синтаксис T3rr0r
источник
источник
memory leak
лучше вашего».Ответы:
Здесь вы путаете разные типы утечек памяти.
Ужасные утечки памяти, основанные на явном управлении памятью, исчезли в Java (или любом другом языке, основанном на сборке мусора). Эти утечки вызваны полной потерей доступа к фрагментам памяти без пометки их как неиспользуемых.
«Утечки памяти» все еще присутствуют в Java и во всех других языках на планете, пока компьютер не сможет читать наши мысли, все еще с нами и будут в обозримом будущем. Эти утечки вызваны тем, что код / программист хранит ссылки на объекты, которые технически больше не нужны. Это принципиально логические ошибки, и их нельзя предотвратить ни на одном языке с помощью современных технологий.
источник
java.util.logging.Level
который содержит частную статику,ArrayList
в которую все такие созданные объекты помещены в конструкцию и из которых они никогда не удаляются), что затрудняет их предотвращение при программировании Java, чем на каком-либо другом языке, который не содержит таких недостатковВполне возможно, что программы Go будут демонстрировать утечки памяти. Текущая реализация Go имеет простой сборщик мусора с функцией отметки и очистки. Это задумано только как временное решение и не предназначено как долгосрочный сборщик мусора. См. Эту страницу для получения дополнительной информации. Загляните под шапку
Go Garbage Collector
. На этой странице даже есть ссылка на код для текущей версии, если вы так хотите.источник
«Утечка памяти» - это когда часть памяти, которая, по мнению программиста, должна быть освобождена, не освобождается. Это может происходить на любом языке, вне зависимости от того, выполняется сборка мусора или нет. Обычная причина в языках GC - сохранение дополнительной ссылки на память.
«Языки не вызывают утечек памяти, программисты вызывают утечки памяти».
источник
Сборка мусора или нет, но вы можете написать программу с утечками памяти на Java, Go или любом другом языке по большей части.
Сборка мусора частично снимает нагрузку с программиста, но не предотвращает полностью утечки.
источник
Здесь вы смешиваете уровни абстракции: утечки памяти происходят из-за ошибок в библиотеке (где объекты ссылаются друг на друга, хотя цепочки `` удерживает ссылку на b '', а также компромисс при реализации сборщика мусора между эффективностью и точность. Сколько времени вы хотите потратить на обнаружение таких петель? Если вы потратите в два раза больше, вы сможете обнаруживать петли в два раза дольше.
Таким образом, проблема утечки памяти не связана с конкретным языком программирования, и нет причин, по которым GO должен быть лучше или хуже, чем Java.
источник