Является ли сбор мусора вредным для выполнения этого типа программы

Я создаю программу, которая будет жить на экземпляре AWS EC2 (возможно), вызывается периодически с помощью задания cron. Программа будет "сканировать" / "опросы" конкретных веб-сайтов, с которыми мы сотрудничаем, и индексировать/агрегировать их содержимое и обновлять нашу базу данных. Я думаю, что java идеально подходит для языка программирования этого приложения. Некоторые члены нашей инженерной команды обеспокоены ухудшением производительности функции сбора мусора java и предлагают использовать С++.

Являются ли эти действительные проблемы? Это приложение, которое будет вызываться каждый раз каждые 30 минут через задание cron, и до тех пор, пока он завершит свою задачу в течение этого периода времени, производительность будет приемлемой, я бы предположил. Я не уверен, что сбор мусора будет проблемой производительности, поскольку я предполагаю, что на сервере будет много памяти и фактический акт отслеживания того, сколько объектов указывает на область памяти, а затем объявить, что память свободна, когда она достигает 0 не кажется мне слишком вредным.

Ответ 1

Нет, ваши проблемы скорее всего необоснованны.

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

Маловероятно, чтобы веб-искатель соответствовал одному из двух вышеупомянутых профилей - вам, вероятно, не нужно массовое старое поколение и должно иметь относительно короткие объекты (представление страницы в памяти при анализе данных), и это будет эффективно обрабатывается в коллекционере молодого поколения.

У нас есть собственный искатель (Java), который может с удовольствием обрабатывать 2 миллиона страниц в день, включая некоторую дополнительную пост-обработку на страницу, на товарном оборудовании (2G RAM), основным ограничением является пропускная способность. GC не является проблемой.

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

Ответ 2

Типичная проблема, с которой программисты на С++ имеют для GC, является одним из латентных периодов. То есть, когда вы запускаете программу, периодические GC прерывают мутатор и вызывают спайки в латентности. Назад, когда я использовал веб-приложения Java для жизни, у меня было несколько клиентов, которые увидели бы латентные всплески в журналах и жаловались на это - и моя задача состояла в том, чтобы настроить GC, чтобы минимизировать влияние этих всплесков. На протяжении многих лет в GC есть относительно сложные достижения, чтобы заставить чудовищные Java-приложения работать с постоянной низкой задержкой, и я впечатлен работой инженеров Sun (теперь Oracle), которые сделали это возможным.

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

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

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

Ответ 3

Получение и разбор веб-сайтов займет больше времени, чем сборщик мусора, его воздействие будет, вероятно, нецелесообразным. Более того, автоматическое управление памятью часто более эффективно при работе с большим количеством мелких объектов (например, строк), чем управление ручной памятью с помощью new/delete. Не говоря уже о том, что сборку мусора легче использовать.

Ответ 4

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

Причина в том, что современный GC "повторно упаковывает" кучу на регулярной основе, перемещая объекты из "eden" в пространство для оставшихся в живых, а затем в кучу объектов, и современные GC сильно оптимизированы для случая где много мелких объектов выделяются, а затем быстро освобождаются.

Например, построение новой строки в Java (на любой современной JVM) выполняется так же быстро, как выделение стека на С++. В отличие от этого, если вы не делаете фантастический материал для пула в С++, вы действительно будете облагать налогом свой распределитель с множеством небольших и быстрых распределений.

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

Ответ 5

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

Для некоторых жестких данных для совместного использования с коллегами, показывающих, что GC выполняет, а также malloc/free с большим количеством доступной оперативной памяти, см.

" Количественная оценка эффективности сборки мусора против явного управления памятью, Мэтью Герц и Эмери Д. Бергер, OOPSLA 2005.

В этой статье приводятся эмпирические ответы на давний вопрос: сбор мусора быстрее/медленнее/с той же скоростью, что и malloc/free? Мы вводят управление оракулярной памятью, подход, который позволяет нам измерять неизмененные Java-программы, как если бы они использовали malloc и бесплатно. Результат: a хороший GC может соответствовать производительности хорошего распределителя, но требуется 5X больше пространства. Однако, если физическая память жесткая, обычный мусор коллекционеры страдают от штрафа за поправку на порядок.

Бумага: PDF Презентационные слайды: PPT, PDF