Как работает память в Ruby? - PullRequest
       0

Как работает память в Ruby?

0 голосов
/ 26 апреля 2018

Я пытаюсь понять идею использования памяти в Ruby . В настоящее время у меня возникают проблемы с памятью в моем веб-приложении и API Rails.

Вот простой вопрос:

Если я загружаю много записей внутри переменной, вот так:

users = User.where(work: 'cook')

Это, вероятно, будет храниться в памяти моего приложения, пока я использую эту переменную, верно?

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

users = nil

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

1 Ответ

0 голосов
/ 26 апреля 2018

Да, если установить для пользователей значение nil, это действительно уменьшит требуемую память (очень незначительно), но это необязательно, так как сборщик мусора в конечном итоге сместит ее. В работе вы должны предполагать, что ваш процесс Ruby всегда будет расти со временем, и его следует периодически перезапускать, если вы беспокоитесь об управлении памятью. Максимальное уменьшение пространства кучи, которое вы когда-либо увидите в ruby, является минимальным по сравнению с его ростом с течением времени, поэтому я не стал бы беспокоиться о том, чтобы установить для больших коллекций значение nil, чтобы сэкономить несколько байтов здесь и там немного раньше, чем GC мог бы смести это все равно. Ruby размещает объекты в пространстве кучи, которое состоит из страниц кучи. Предполагая, что вы используете Ruby2.1 или лучше, пространство кучи делится на использованную (иначе говоря, Eden) и пустую (иначе говоря, Tomb) страницы кучи. При создании экземпляров объектов ruby ​​сначала ищет свободное место на страницах eden, и только если свободного места нет, он извлекает страницу из гробницы. Когда вы затем перезаписываете объект на ноль, эти страницы кучи добавляются обратно в могилу. Перемещение страниц из Эдема в могилу немного уменьшит размер кучи, однако Ruby's Garbage Collector не сильно уменьшит его, поскольку предполагает, что, если вы уже создали большую коллекцию объектов, вы сделаете это снова. Одна книга, в которую я рекомендую углубиться, - это «Оптимизация производительности Ruby», поскольку она подробно описывает сборщик мусора ruby.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...