@runapa

Освобождается ли память?

Всем привет!
Вопрос возник.
Освобождается ли память, если при прогоне массива в цикле, делать unset пройденому элементу?
  • Вопрос задан
  • 193 просмотра
Решения вопроса 2
SerafimArts
@SerafimArts
Senior Notepad Reader
unset помечает zval как освобождённый. Фактически, на внутреннем уровне, это просто каст к другому типу. До PHP 7.x это свойство даже в юзерленд было выведено.

Примечание: Сейчас код отличается и сходу сказать как оно устроено не могу, если интересно поразбираться, то вот хендлер сабжевого опкода: https://github.com/php/php-src/blob/b227a722859e83...

Всё остальное поведение уже регламентируется самим кодом: в какой момент сработает так называемый "stop the world" для подсчёта refcount и подчистки памяти. Крайний случай - это единица компиляции PHP, т.е. файл. При выходе из него всё подчищается. В идеальном же случае подчистка происходит сразу же при потере ссылки на zval даже без всяких unset.

Помимо этого терминология "подчистка" означает высвобождение пользовательской памяти, которую далее может занять другая переменная без лишних аллокаций, а не высвобождение памяти под процесс операционки. Второе происходит раз в определённые промежутки времени (тут я хз когда).

В результате, если построить график потребления ОЗУ - она всегда будет хаваться "лесенкой" (выделение пула памяти, её использование, её многократное переиспользование, и очистка в случаях, когда есть понимание того, что количество выделенной памяти избыточно) используешь ли ты unset или нет.
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
В общем, зависит от того, какие именно данные лежат в массиве.
Если всякая мелочь типа чисел, то не уменьшается.
Если что-то другое - то уменьшается.

Но если память настолько критична, то в первую очередь не должно быть массива исходно.
Вместо того чтобы получать данные все скопом в массив, их брать и обрабатывать по одной строчке.
Ответ написан
@rPman
в куче процесса освобождается, а вот для операционной системы уже не факт
можно попросить php задуматься об освобождении освободной памяти по раньше, выполнив gc_collect_cycles
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы