Зачем собирать мусор в веб-приложениях?
Рассмотрите возможность создания веб-приложения на платформе, где каждый запрос обрабатывается потоком пользовательского уровня (ULT) (зеленый поток / процесс erlang /goroutine/... любой легкий поток). Предполагая, что каждый запрос не имеет состояния и ресурсы, такие как соединение с БД, получаются при запуске приложения и распределяются между этими потоками. Зачем нужна сборка мусора в этих потоках?
Обычно такой поток является коротким (несколько миллисекунд) и, если он хорошо спроектирован, не использует более нескольких (КБ или МБ) памяти. Если сборка мусора для ресурсов, выделенных в потоке, выполняется на выходе потока и не зависит от других потоков, то не будет никаких GC-пауз даже для 98-го или 99-го процентиля запросов. Все запросы будут даны ответы в предсказуемое время.
В чем проблема с такой моделью и почему она не используется широко?
1 ответ
Ваше предположение не может быть правдой.
если хорошо продуманный, не использует больше (КБ или МБ) памяти
Представьте себе функцию для подсчета слов в текстовом файле, который используется в веб-приложении. Некоторые наивные реализации могут быть,
def count_words(text):
words = text.split()
count = {}
for w in words:
if w in count:
count[w] += 1
else:
count[w] = 1
return count
Он выделяет больше памяти, чем текст.