3v4l.org

run code in 300+ PHP versions simultaneously
<?php declare(strict_types=1); namespace Repro; class CycleValue { public static bool $shutdown = false; private $value; private ?\stdClass $cycleRef; public function __construct($value) { $this->value = $value; // make self cyclically referenced to require GC run to be released $this->cycleRef = new \stdClass(); $this->cycleRef->x = $this; } public function __destruct() { if (!CycleValue::$shutdown) { // recreate self - prevent value to be effectively released until self::$shutdown is set new self($this->value); } } } $refs = []; for ($i = 1; $i <= 3_200; $i++) { $v = new \stdClass(); $v->i = $i; $refs[] = [ \WeakReference::create(new CycleValue($v)), \WeakReference::create($v), ]; if (($i % 100) === 0) { gc_collect_cycles(); if (PHP_VERSION_ID < 80100) { gc_collect_cycles(); } if ($i >= 2_500) { echo count($refs) . ', peak: ' . round(memory_get_peak_usage(true) / (1024 * 1024), 2) . ' MiB, GC runs: ' . (gc_status()['runs'] - $gcRuns) . ', time: ' . round(microtime(true) - $t, 2) . " s \n"; } foreach ($refs as [$rCycle, $rV]) { if ($rCycle->get() !== null) { throw new \Error('CycleValue not released'); } elseif ($rV->get() === null) { throw new \Error('Object released'); } } $t = microtime(true); $gcRuns = gc_status()['runs']; } } CycleValue::$shutdown = true; unset($v); gc_collect_cycles(); if (PHP_VERSION_ID < 80100) { gc_collect_cycles(); } foreach ($refs as [$rCycle, $rV]) { if ($rCycle->get() !== null) { throw new \Error('Shutdown: CycleValue not released'); } elseif ($rV->get() !== null) { throw new \Error('Shutdown: Object not released'); } } echo "done\n";
Output for 8.2.15, 8.3.0 - 8.3.3, 8.3.6 - 8.3.7
2500, peak: 8 MiB, GC runs: 2, time: 0 s 2600, peak: 8 MiB, GC runs: 2, time: 0 s 2700, peak: 8 MiB, GC runs: 2, time: 0 s 2800, peak: 8 MiB, GC runs: 2, time: 0 s 2900, peak: 8 MiB, GC runs: 2, time: 0 s 3000, peak: 8 MiB, GC runs: 2, time: 0 s 3100, peak: 8 MiB, GC runs: 2, time: 0.01 s 3200, peak: 8 MiB, GC runs: 4, time: 0.01 s done
Output for 8.2.0 - 8.2.4, 8.2.6 - 8.2.13, 8.2.16 - 8.2.17, 8.2.19, 8.3.5
2500, peak: 8 MiB, GC runs: 2, time: 0 s 2600, peak: 8 MiB, GC runs: 2, time: 0 s 2700, peak: 8 MiB, GC runs: 2, time: 0 s 2800, peak: 8 MiB, GC runs: 2, time: 0 s 2900, peak: 8 MiB, GC runs: 2, time: 0 s 3000, peak: 8 MiB, GC runs: 2, time: 0 s 3100, peak: 8 MiB, GC runs: 2, time: 0 s 3200, peak: 8 MiB, GC runs: 4, time: 0.01 s done
Output for 8.3.4
2500, peak: 8 MiB, GC runs: 2, time: 0 s 2600, peak: 8 MiB, GC runs: 2, time: 0.01 s 2700, peak: 8 MiB, GC runs: 2, time: 0 s 2800, peak: 8 MiB, GC runs: 2, time: 0 s 2900, peak: 8 MiB, GC runs: 2, time: 0 s 3000, peak: 8 MiB, GC runs: 2, time: 0.01 s 3100, peak: 8 MiB, GC runs: 2, time: 0.01 s 3200, peak: 8 MiB, GC runs: 4, time: 0.01 s done
Output for 8.2.18
2500, peak: 8 MiB, GC runs: 2, time: 0 s 2600, peak: 8 MiB, GC runs: 2, time: 0 s 2700, peak: 8 MiB, GC runs: 2, time: 0 s 2800, peak: 8 MiB, GC runs: 2, time: 0 s 2900, peak: 8 MiB, GC runs: 2, time: 0.01 s 3000, peak: 8 MiB, GC runs: 2, time: 0 s 3100, peak: 8 MiB, GC runs: 2, time: 0 s 3200, peak: 8 MiB, GC runs: 4, time: 0.01 s done
Output for 8.2.14
2500, peak: 8 MiB, GC runs: 2, time: 0 s 2600, peak: 8 MiB, GC runs: 2, time: 0 s 2700, peak: 8 MiB, GC runs: 2, time: 0 s 2800, peak: 8 MiB, GC runs: 2, time: 0 s 2900, peak: 8 MiB, GC runs: 2, time: 0 s 3000, peak: 8 MiB, GC runs: 2, time: 0.01 s 3100, peak: 8 MiB, GC runs: 2, time: 0 s 3200, peak: 8 MiB, GC runs: 4, time: 0.01 s done
Output for 8.2.5
2500, peak: 8 MiB, GC runs: 2, time: 0 s 2600, peak: 8 MiB, GC runs: 2, time: 0 s 2700, peak: 8 MiB, GC runs: 2, time: 0.01 s 2800, peak: 8 MiB, GC runs: 2, time: 0 s 2900, peak: 8 MiB, GC runs: 2, time: 0 s 3000, peak: 8 MiB, GC runs: 2, time: 0 s 3100, peak: 8 MiB, GC runs: 2, time: 0 s 3200, peak: 8 MiB, GC runs: 4, time: 0.01 s done
Output for 8.1.0 - 8.1.28
2500, peak: 8 MiB, GC runs: 2, time: 0 s 2600, peak: 8 MiB, GC runs: 2, time: 0 s 2700, peak: 8 MiB, GC runs: 2, time: 0 s 2800, peak: 8 MiB, GC runs: 2, time: 0 s 2900, peak: 8 MiB, GC runs: 2, time: 0 s 3000, peak: 8 MiB, GC runs: 2, time: 0 s 3100, peak: 10 MiB, GC runs: 2, time: 0 s 3200, peak: 10 MiB, GC runs: 4, time: 0.01 s done

preferences:
73.07 ms | 416 KiB | 5 Q