Разница между локальными и переменными экземпляра в ruby - PullRequest
2 голосов
/ 14 января 2011

Я работаю над сценарием, который создает несколько довольно сложных вложенных хеш-структур данных, а затем выполняет итерацию по ним, создавая условно записи в базе данных.Это автономный скрипт, использующий активную запись.После нескольких минут работы я заметил значительное отставание в отклике сервера и обнаружил, что сценарий, для которого установлено значение nice +19, постоянно использует общий объем памяти сервера% 85 -% 90.

В этом случаеЯ использую переменные экземпляра просто для удобства чтения.Это помогает знать, что будет повторно использоваться вне цикла, а что нет.Есть ли причина не использовать переменные экземпляра, когда они не нужны?Существуют ли различия в распределении памяти и управлении между локальными переменными и переменными экземпляра?Поможет ли настройка @variable = nil, когда она больше не нужна?

Ответы [ 2 ]

5 голосов
/ 14 января 2011

Переменная экземпляра продолжает существовать в течение всего срока службы объекта, который ее содержит.Локальная переменная существует только внутри одного метода, блока или тела модуля.

Если вы предполагаете, что объекты в переменных экземпляра вашего объекта будут собираться мусором только потому, что вы не собираетесь ссылаться на них вбудущее, это не так, как это работает.Сборщик мусора знает только, есть ли доступная ссылка на объект - и есть ли она в переменной экземпляра.

2 голосов
/ 14 января 2011

Установка @ variable = nil уничтожает ссылку на объект, на который однажды указала переменная экземпляра. Когда больше нет оставшихся ссылок на объект, он должен быть в конечном итоге собран сборщиком мусора. Я говорю «в конце концов», потому что GC несколько непредсказуемо. Однако легко получить утечку памяти из-за «висячей ссылки» и, возможно, (в зависимости от того, как реализован GC) циклические ссылки. Что еще относится к этому объекту?

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