Как старший разработчик, который долгое время занимался этим на многих языках, вот мои мысли:
Хотя я думаю, что при использовании скомпилированного языка, такого как C, у вас хорошие намерения, детальное управление памятью, управляемое разработчиком, не соответствует тому, как работают такие языки, как Ruby, Python и Perl.
Языки сценариев, такие как Perl, Ruby и Python, защищают нас от забот управления памятью. Это одна из причин, по которой они нам нравятся. Если у нас будет доступная память, они будут использовать то, что им нужно, чтобы выполнить работу. Потеря контроля управления памятью является компромиссом для скорости разработки и простоты отладки; У нас его нет, и нам не нужно об этом беспокоиться. Если мне это нужно, я буду использовать C или ассемблер.
Если предположить, что это утечка памяти, я думаю, это немного наивно или самонадеянно. Утечка памяти, о которой вы упомянули, будет значительной утечкой, и с таким большим количеством приложений и сайтов на основе Ruby кто-то заметил бы это давно. Итак, в качестве проверки работоспособности для себя, когда я вижу что-то, что не имеет смысла, я всегда думаю, что сначала я делаю что-то не так в своем коде, затем я посмотрю на свои предположения о том, как что-то работает, и если они все еще кажутся здоровыми, я пойду искать других людей, у которых есть похожие проблемы, и посмотрю, есть ли у них решения. И, если проблема заключается в ядре языка, я покопаюсь в источнике или поговорю с некоторыми из разработчиков ядра и спрошу, не схожу ли я с тем, что вижу. Раньше я находил низкоуровневые ошибки, но они были угловыми случаями, и я потратил пару дней на копания, прежде чем что-то упоминать, потому что я не хотел быть таким, как мой коллега, который подал бы сообщение об ошибке немедленно с Apple, затем узнайте, что это ошибка в его коде.
Мое общее мнение о возврате памяти обратно в систему при освобождении, заключается в том, что она влечет за собой дополнительные издержки, которые могут быть обращены вспять в следующей операции, что приводит к потере циклов ЦП, что интерпретируется и языки сценариев не могут себе позволить, поскольку они не так быстры, как скомпилированные языки для начала. Я думаю, что для языка было бы справедливо предположить, что ему нужно будет многократно выделять большой блок памяти, если он должен был это сделать один раз, особенно с таким ОО-языком, как Ruby. На этом этапе имеет смысл сохранить ранее использованную память.
И, по большому счету, выделение 1 000 000 элементов массива такого размера не занимает много памяти, учитывая, сколько у нас обычно свободно в наших коробках. Я был бы более обеспокоен необходимостью сохранять 1 000 000 элементов в массиве в памяти и рекомендовал бы коллегам, что они должны серьезно относиться к использованию базы данных. У вас может быть веская деловая причина для хранения всего этого в оперативной памяти. Если это так, вы можете увеличить объем оперативной памяти на хосте, и все будет в порядке.