Управление памятью

Программистам на C обычно приходится управлять памятью вручную. При работе с динамической памятью программист выделяет память, когда она нужна, и освобождает её, когда работа закончена. Если не освободить динамическую память, возникает «утечка памяти», что может быть как плохо, так и не очень. В случае PHP, поскольку процесс может жить практически бесконечно долго, возникновение утечки памяти будет иметь катастрофические последствия. В любом случае утечка памяти на самом деле означает плохо и некачественно спроектированные программы, которым нельзя доверять. Утечку памяти легко понять. Вы просите ОС зарезервировать для вас часть основной памяти машины, но никогда не сообщаете ей, что нужно освободить эту память обратно для использования другими процессами: вы не одни на машине, другим процессам тоже нужна память, да и самой ОС тоже.

Кроме того, в C области памяти имеют чётко заданные границы. Чтение или запись до или после этих границ — очень опасная операция. Это почти наверняка приведёт к падению программы, а в худшем случае — к уязвимости, которую можно эксплуатировать. В языке C нет никакой магии, подобной автоматически расширяющимся областям памяти. Вы должны явно говорить машине (и процессору), что именно вы хотите сделать. Никаких догадок, никакой магии, никакой автоматизации какого бы то ни было вида (например, сборки мусора).

У PHP есть собственная, весьма специфическая модель работы с памятью, и он предоставляет собственный слой над традиционным динамическим аллокатором памяти libc. Этот слой называется Zend Memory Manager.

В этой главе объясняется, что такое Zend Memory Manager, как его нужно использовать и что с ним можно/нельзя делать. После этого мы вкратце познакомим вас со специфическими инструментами, используемыми в мире C для отладки динамической памяти.

Note

При необходимости получите (желательно основательные) знания о классах выделения памяти в C (статическая память в сравнении с динамической), а также об аллокаторе libc.

Содержание: