Я потратил неделю, чтобы понять, почему один из моих сценариев на ruby рос в памяти. Я обнаружил линию преступника, но не могу понять, почему она растет в памяти в одном случае, а не в другом:
У меня есть простой вечный цикл с условием для объекта Time:
i = 0
lastTry = Time.now()
until i == 5
if (lastTry + 0.75) < Time.now
puts '.'
lastTry = Time.now()
end
end
Это произведет процесс, который будет потреблять память до тех пор, пока мой оперативный памяти не заполнится, и в конечном итоге мое ядро перестанет позволять мне вилки или паникует в какой-то момент. Плохо для моего клиента.
Если я заменю свой if на это:
if ((Time.now() - lastTry) * 1000.0) > 750.0
Это больше не пожирает память.
-> как указано в комментарии, я могу подтвердить, что происхождение этого связано с устаревшей версией ruby, используемой в моей клиентской среде.