Должны ли Java-разработчики знать об алгоритмах сборки мусора? [закрыто]

11

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

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

Ребята, вы думаете, что разработчики Java должны знать об алгоритмах сборщика мусора? Если да, можете ли вы сказать мне, какие из них я должен посмотреть?

Фанат
источник
1
Да, они должны. В противном случае они рискуют написать программное обеспечение, которое ломается при большой нагрузке.
Quant_dev

Ответы:

9

Я думаю, что знание алгоритмов сборки мусора совсем не важно, если вы разрабатываете «стандартное программное обеспечение», а не программные платформы. Вы должны иметь общее представление о том, как работает сборщик мусора, и это все. Если вы не испытываете критических задержек в вашем программном обеспечении, вызванных сборкой мусора, или вам не нужно оптимизировать использование памяти.

Если вы заинтересованы в этих алгоритмах, пожалуйста , просмотреть этот мой: Какие алгоритмы за низкой GC паузы?

сокол
источник
7

Сборка мусора - интересная, нетривиальная проблема информатики.

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

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

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

JohnMcG
источник
2
Зная понимание основ, с которыми я бы согласился (понимание вещей делает вас лучшим программистом). Проблема в том, что если вы знаете сложные детали, а затем use that informationразработать свой код. Это может вызвать проблемы, поскольку GC улучшается, и ваши предположения о том, как GC больше не удерживается, и код становится неоптимальным (а в худшем случае может помешать GC). Полезно знать, но вы должны разрабатывать свой код, используя лучшие практики, а не с конкретной реализацией; компиляторы и сборщик мусора постоянно улучшаются, и в конечном итоге оптимизация макросов просто не будет полезна.
Мартин Йорк,
Я больше думал о том, что если вы знаете что-то о том, как Stringэто реализовано, то вы не будете объединять строку, используя +цикл.
JohnMcG
4

Я вижу две причины, почему нужно знать, как работает сборщик мусора (или любой алгоритм / технология). Вот они:
1. Вы получаете лучшее представление о том, что происходит под написанным вами кодом. Это часто может помочь вам написать более эффективный код, который гарантирует лучшую производительность. В некоторых случаях это может быть жизненно важно. (У меня был неприятный опыт, когда GWT полагался на сборщик мусора в браузере, и у нас была огромная утечка памяти в Chrome. Поэтому нам пришлось посмотреть, что именно вызвало утечку.)
2. Такие алгоритмы всегда (или почти всегда, нет, всегда) доверял умным, опытным, квалифицированным и опытным разработчикам. Поэтому изучение их подхода может быть очень полезным.

Я вижу еще одну причину, по которой вам задавали такой вопрос на собеседовании. Некоторые разработчики (особенно мой бывший коллега) считают, что разработчик недостаточно умён или трудолюбив, если он / она не знает таких вещей. Я не согласен с этим утверждением. Но в любом случае, зная такие вещи, это хороший способ произвести впечатление на интервьюера.

superM
источник
1
Я согласен с (2) и половиной (1) (помогает в отладке). Но есть опасность в (1), и вы можете создать свой код для работы с конкретной реализацией GC, так как он больше не будет оптимальным, когда либо улучшается GC, либо вы переходите к реализации с GC другого типа.
Мартин Йорк,
@Loki Astari, вы правы в том, что это опасно для конкретных реализаций. Но, с другой стороны, есть вещи, которые не меняются (по крайней мере, надолго), например принципы сбора мусора в .NET.
СуперМ
@superM: На самом деле GC Mono значительно отличается от Microsoft, и в настоящее время его заменяют другим, совершенно другим.
Йорг Миттаг
@superM: Мне не кажется, что медленная эволюция Java: en.wikipedia.org/wiki/Java_version_history (похоже, раз в год выпускается новый патч или обновление). С новым выпуском в следующем году. Теперь это не означает, что GC обновляется каждый раз, но показывает потенциал для этого.
Мартин Йорк
@ Локи Астари, это верно. Многое в разработке программного обеспечения постоянно меняется, и наша задача - идти в ногу с этим. Кроме того, все изменения основаны на том, что уже есть, поэтому я не ожидаю каких-либо радикальных изменений в 1 или 2 версии.
SuperM
4

Вы должны знать о сборке мусора поколений и особенностях сборки мусора Java (пространства PermGen, Eden и Tenured). Вы также должны быть знакомы с сборкой мусора в целом (например, почему подсчет ссылок, как правило, плохая идея, и почему лучше использовать метку и разметку). Я также рекомендовал бы ознакомиться с некоторыми альтернативными реализациями (такими как «без пауз» GC в Zul JVM от Azul и проект IBM Metronome в реальном времени ).

TMN
источник
3

У вас должны быть НЕКОТОРЫЕ знания о том, как работает сборка мусора для Java по двум причинам:

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

Во-вторых, если вы не знаете, как это работает, вы не сможете настроить GC для данного приложения. Большинству Java-программистов никогда не нужно настраивать GC, поскольку параметры по умолчанию работают достаточно хорошо в большинстве случаев. Если вы делаете что-то, что выходит из этого «большую часть времени», то вы можете настроить параметры GC. Делать это без ведома GC - это просто случайное вращение ручек - вы можете извлечь из этого что-то полезное, но, скорее всего, вы просто испортите ситуацию.

Итак, хотя я не ожидал бы, что хороший Java-программист будет знать все о GC под солнцем, я бы ожидал, что этот программист узнает на каком-то уровне, как GC в JVM используют функции и каковы компромиссы для этого. GC алгоритм.

Майкл Кон
источник
1

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

Уровень знаний, однако, другой вопрос. Я бы не ожидал, что нормальный разработчик объяснит разницу с реальной реализацией (я должен был бы провести некоторое собственное исследование этого вопроса), однако основным принципом того, что делает GC, и какими должны быть плюсы и минусы в отношении управления памятью самостоятельно Чисто.

perdian
источник