Вопросы ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π» ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π», Ρ‡Ρ‚ΠΎ простой сбор ΠΊΠΎΡ€Π½Π΅ΠΉ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ влияСт Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π½ΠΎ это Ссли ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ PHP 5.2 с PHP 5.3. Π₯отя запись ΠΊΠΎΡ€Π½Π΅ΠΉ Π² Π±ΡƒΡ„Π΅Ρ€ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с отсутствиСм Ρ‚Π°ΠΊΠΎΠΉ записи Π² PHP 5.2 замСдляСт Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ измСнСния Π² Ρ€Π°Π±ΠΎΡ‚Π΅ PHP 5.3 Π²ΠΎ врСмя выполнСния ΠΊΠΎΠ΄Π° ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ проявлСниС этой ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ страдаСт Π² Π΄Π²ΡƒΡ… Π³Π»Π°Π²Π½Ρ‹Ρ… областях. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ β€” ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° памяти, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ PHP Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ Π½Π° запись ΠΊΠΎΡ€Π½Π΅ΠΉ, Π° вторая β€” Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠ° Π²ΠΎ врСмя выполнСния ΠΊΠΎΠ΄Π°, ΠΊΠΎΠ³Π΄Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сборки мусора ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Рассмотрим ΠΎΠ±Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

УмСньшСниС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° памяти

ΠŸΠ΅Ρ€Π²Π°Ρ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° появлСния Π² языкС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° сборки мусора, состоит Π² ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° памяти, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ мусор, ΠΏΡƒΡ‚Ρ‘ΠΌ очистки ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с цикличСскими ссылками Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° выполнятся ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ условия. Π’ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ PHP сборка мусора начинаСтся, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ заполняСтся ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ gc_collect_cycles(). Π“Ρ€Π°Ρ„ΠΈΠΊ Π½ΠΈΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ скрипт ΠΏΠΎΠ΄ Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΌ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² PHP 5.2 ΠΈ PHP 5.3, Π±Π΅Π· ΡƒΡ‡Ρ‘Ρ‚Π° памяти, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ сам PHP ΠΏΡ€ΠΈ запускС.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования памяти

<?php

class Foo
{
public
$var = '3.14159265359';
public
$self;
}

$baseMemory = memory_get_usage();

for (
$i = 0; $i <= 100000; $i++) {
$a = new Foo();
$a->self = $a;
if (
$i % 500 === 0) {
echo
sprintf('%8d: ', $i), memory_get_usage() - $baseMemory, "\n";
}
}

?>
Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ потрСблСния памяти Π² PHP 5.2 ΠΈ PHP 5.3

Π’ этом акадСмичСском ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ создаётся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ устанавливаСтся свойство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° сам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. Когда Π² скриптС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ $a Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ†ΠΈΠΊΠ»Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, происходит типичная ΡƒΡ‚Π΅Ρ‡ΠΊΠ° памяти. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΡƒΡ‚Π΅ΠΊΠ°Π΅Ρ‚ ΠΏΠ°ΠΌΡΡ‚ΡŒ для Π΄Π²ΡƒΡ… zval-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² β€” ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° свойства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, β€” Π½ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΡ€Π΅Π½ΡŒ: ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠ΄Π°Π»ΠΈΠ»ΠΈ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС 10 000 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ (Ссли PHP-сборка Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 10 000 ΠΊΠΎΡ€Π½Π΅ΠΉ) ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€ заполняСтся, срабатываСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сборки мусора ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ эти ΠΊΠΎΡ€Π½ΠΈ, освобоТдаСтся. Π­Ρ‚ΠΎΡ‚ процСсс Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π²ΠΈΠ΄Π΅Π½ Π½Π° Π½Π΅Ρ€Π°Π²Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠΌ Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅ потрСблСния памяти PHP 5.3: послС ΠΊΠ°ΠΆΠ΄Ρ‹Ρ… 10 000 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊ просСдаСт. Π‘Π°ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ структура ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ проста. Из Π³Ρ€Π°Ρ„ΠΈΠΊΠ° Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ максимальноС ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти Π² PHP 5.3 составило ΠΎΠΊΠΎΠ»ΠΎ 9 ΠœΠ‘, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² PHP 5.2 ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ расти.

Π—Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Вторая ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сборки мусора влияСт Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, β€” потСря Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ трСбуСтся сборщику мусора для освобоТдСния Β«ΡƒΡ‚Π΅Ρ‡ΠΊΠΈΒ» памяти. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ влияния, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ скрипт ΠΏΡƒΡ‚Ρ‘ΠΌ добавлСния количСства ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ удалСния ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ потрСблСния памяти. ПослС измСнСния скрипт выглядит Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 ВлияниС Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ

<?php

class Foo
{
public
$var = '3.14159265359';
public
$self;
}

for (
$i = 0; $i <= 1000000; $i++) {
$a = new Foo();
$a->self = $a;
}

echo
memory_get_peak_usage(), "\n";

?>

Запустим скрипт Π΄Π²Π° Ρ€Π°Π·Π°: с Π²ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ zend.enable_gc ΠΈ Π±Π΅Π· Π½Π΅Ρ‘.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #3 Запуск скрипта

time php -dzend.enable_gc=0 -dmemory_limit=-1 -n example2.php
# ΠΈ
time php -dzend.enable_gc=1 -dmemory_limit=-1 -n example2.php

На тСстовой машинС пСрвая ΠΊΠΎΠΌΠ°Π½Π΄Π° выполняСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 10.7 сСкунды, Π° вторая ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 11.4 сСкунды. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π½Π° 7 % ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅. Однако максимальноС ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти скриптом ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΎΡΡŒ Π½Π° 98 % β€” с 931 Π΄ΠΎ 10 ΠœΠ‘. Π­Ρ‚ΠΎΡ‚ тСст ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π΅ Π½Π°ΡƒΡ‡Π½Ρ‹ΠΉ ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ прСдставляСт Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ прСимущСства Π² Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Ρ‘Ρ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сборки мусора. Π₯ΠΎΡ€ΠΎΡˆΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ скрипта ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· составляСт ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ 7 %, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ экономия памяти постоянно увСличиваСтся ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π²ΠΎ врСмя выполнСния скрипта ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ всё большС цикличСских ссылок.

ВнутрСнняя статистика сборщика мусора

PHP ΡƒΠΌΠ΅Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ большС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сборки мусора выполняСтся Π² PHP. Но для этого потрСбуСтся ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ PHP, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ тСста ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ сбора Π΄Π°Π½Π½Ρ‹Ρ…. Π”ΠΎ запуска ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ./configure с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, потрСбуСтся ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ для ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния CFLAGS Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -DGC_BENCH=1. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #4 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ пСрСкомпиляции PHP для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ тСста ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ сборки мусора

export CFLAGS=-DGC_BENCH=1
./config.nice
make clean
make

ΠŸΡ€ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΌ запускС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΊΠΎΠ΄Π° с Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ PHP, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ создали, послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния PHP Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #5 Бтатистика сборки мусора

GC Statistics
-------------
Runs:               110
Collected:          2072204
Root buffer length: 0
Root buffer peak:   10000

      Possible            Remove from  Marked
        Root    Buffered     buffer     grey
      --------  --------  -----------  ------
ZVAL   7175487   1491291    1241690   3611871
ZOBJ  28506264   1527980     677581   1025731

Π‘Π°ΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½ΡƒΡŽ статистику ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π»ΠΎΠΊ. Π’ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сборки мусора запускался 110 Ρ€Π°Π·, ΠΈ суммарно освободил большС 2 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² записСй Π² памяти. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сборки мусора сработал хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΈΠΊΠ° ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° (Root buffer peak) Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½ΡΡ‚ΡŒΡΡ 10 000.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора Π² PHP Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° сборки цикличСских ссылок, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² стандартных скриптах мСньшСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ ΠΏΠ°Π΄Π°Π΅Ρ‚.

Когда ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сборки Ρ†ΠΈΠΊΠ»ΠΎΠ² всС-Ρ‚Π°ΠΊΠΈ запускаСтся для стандартных скриптов, ΠΎΠ±ΡŠΡ‘ΠΌ памяти, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ экономит ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Π½Π° сСрвСрС большСС количСство скриптов, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Ρ†Π΅Π»ΠΎΠΌ скрипты Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ памяти.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° Π·Π°ΠΌΠ΅Ρ‚Π½Π΅Π΅ для скриптов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π΄ΠΎΠ»Π³ΠΎ β€” большиС Π½Π°Π±ΠΎΡ€Ρ‹ тСстов ΠΈΠ»ΠΈ Π΄Π΅ΠΌΠΎΠ½Ρ‹. Новый ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ сущСствСнно сокращаСт ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ памяти для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ » PHP-GTK, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ часто Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ дольшС, Ρ‡Π΅ΠΌ скрипты для Π²Π΅Π±Π°.

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 2 notes

up
22
Dmitry dot Balabka at gmail dot com ΒΆ
8 years ago
There is a possibility to get GC performance stats without PHP recompilation. Starting from Xdebug version 2.6 you are able to enable stats collection into the file (default dir /tmp with name gcstats.%p):

php -dxdebug.gc_stats_enable=1 your_script.php
up
19
Talisman ΒΆ
10 years ago
The GC, unfortunately, as expounded in the examples above, has the tendency to promote lazy programming.
Clearly the benefits of the GC to assist in memory management are there, and help to maintain a stable system, but it is no excuse to not plan and test your code properly.
Always re-read your code critically and objectively to ensure that you are not introducing memory leaks unintentionally.