On 22.01.2022 at 17:18, Rowan Tommins wrote:

> On 22/01/2022 15:30, Christoph M. Becker wrote:
>
>> If you trigger the garbage collector manually (i.e. call
>> gc_collect_cycles() after unset($callback)), the loop terminates right
>> away.  I'm not sure why it doesn't without manually triggering the GC.
>
> Most values are freed as soon as their refcount reaches zero, which
> obviously won't happen for circular references, so an additional
> algorithm is needed for those. This "cycle collection" algorithm is
> relatively expensive, so doesn't run every time a possible candidate is
> found, but only when a list of candidates reaches a particular
> threshold. The algorithm is outlined in the manual, although it looks
> like the constant 10000 mentioned there has been replaced by an adaptive
> threshold (which can be inspected with gc_status()):
> https://www.php.net/manual/en/features.gc.collecting-cycles.php
>
> If you measure memory usage while running the example code in a loop,
> you should see it slowly growing and then periodically dropping each
> time a cycle collection is run. That's why gc_collect_cycles() exists -
> if you _know_ you've created circular references, you can tell the
> engine to find and free them immediately, rather than waiting for the
> next pass.

Ah, right.  Thanks Rowan!

Christoph

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to