2010-12-09 1 views
53

Вот факты:Есть ли у вас такие же тонкие утечки памяти, что и Java?

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

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

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

В качестве примера программы Java, который имеет утечку памяти (не для слабость сердца, вопрос может поколебать ваши убеждения), см. здесь о небольшой программе Java под названием Tomcat, которая даже имеет кнопку «найти утечки»: Is there a way to avoid undeployment memory leaks in Tomcat?

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

+26

«У многих программ Java есть (тонкие или нет) утечки памяти« есть ли у вас какие-либо доказательства этого «факта» или это просто точка разговора. – 2010-12-09 16:11:43

+26

@Peter Lawrey: Это факт. Мои доказательства - бесчисленные статьи и, скажем, продвинутые инструменты, которые имеют такие опции, как * «Найти вероятную утечку памяти» * (был ли это JProfiler?). Кроме того, Google на * Java «утечка памяти» * и у вас будет полмиллиона ударов (!). Вы, серьезно, давно не программировали на Java, если не знаете, о чем я говорю. Я даже не начну с тонких утечек, таких как утечки памяти класса загрузчика, которые потребовались годами (на ум приходит известный пример Tomcat + Hibernat + Sun VM). Честно говоря, комментарий, подобный тому, который вы только что сделали, ничего не приносит. – SyntaxT3rr0r 2010-12-09 16:32:49

+2

@Peter Lawrey: и это не совсем недавние знания. Вот статья от IBM на 2001 год: * «Обработка утечек памяти в Java-программах» *. Честно говоря, существует так много статей и инструментов, посвященных этой проблеме, что даже не смешно указывать, насколько хромым является ваш комментарий. – SyntaxT3rr0r 2010-12-09 16:35:17

ответ

2

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

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

8

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

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

16

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

7

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

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

36

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

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

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

Смежные вопросы