Stateless closure cache: unbounded memory growth when the declaring closure has a heap runtime cache (bind/call/traits)
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 48/100
Direção de pesquisa
The report points to ZEND_DECLARE_LAMBDA_FUNCTION, EG(lambda_cache), and the heap runtime cache used for rebound closures; it does not name source files or tests. Start by tracing the stateless closure cache and compare its behavior for ordinary closures and closures rebound with Closure::bind(), Closure::bindTo(), or Closure::call(). Reproduce with the provided loop and memory measurement, then check that repeated calls no longer grow memory while the closure remains usable.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
Description
ZEND_DECLARE_LAMBDA_FUNCTION caches a stateless (static fn) closure in the declaring function's runtime cache and pushes it onto EG(lambda_cache), which is only released at shutdown. When the declaring function is a closure that gets a fresh ZEND_ACC_HEAP_RT_CACHE on every creation/call (rebinding to another scope via Closure::bind()/bindTo(), Closure::call(), or a closure in a trait method used by more than one class), every call misses the cache and pushes another closure, so memory grows linearly for the whole request. This hurts long-running workers (e.g. Macroable-style Closure::bind($macro, null, static::class)).
The following code:
<?php
class A {}
$outer = function () { return (static fn() => 1)(); };
$m = memory_get_usage();
for ($i = 0; $i < 100000; $i++) {
Closure::bind($outer, null, A::class)();
}
echo memory_get_usage() - $m, "\n";
Resulted in this output:
40243200
But I expected this output instead (as in PHP 8.5.12):
0
Trait variant, no explicit binding:
<?php
trait T {
public function m($k) {
$f = function () use ($k) { return (static fn($x) => $x + 1)($k); };
return $f();
}
}
class U1 { use T; }
class U2 { use T; }
(new U1)->m(0);
$u2 = new U2;
$m = memory_get_usage();
for ($i = 0; $i < 100000; $i++) { $u2->m($i); }
echo memory_get_usage() - $m, "\n";
8.6: 41843072, 8.5.12: 0.
$outer->bindTo(null, A::class)() and $outer->call($obj) grow the same way. The debug build reports no leak because EG(lambda_cache) is cleaned at shutdown. Introduced by f47cd216e95 (stateless closure cache). Reproduces with opcache off, on, and with tracing JIT.
PHP Version
PHP 8.6.1-dev (cli) (NTS DEBUG), PHP-8.6 @ dfc3219f341
Operating System
macOS (arm64)
- Linguagem predominante
- C
- Estrelas
- 41.8k
- Forks
- 8.5k
- Merge médio
- 2d 13h
- PRs com merge (30d)
- 145
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Sem modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de php/php-src
-
ext/openssl: 8.2.31+/8.3.31+ fail to build against OpenSSL 1.0.2 (ASN1_STRING_get0_data in xp_ssl.c)Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 79/100
Mantenedores costumam responder em até 1 dia
-
Bug Status: Needs Triage
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
php/php-src#25397 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
SNMP accepts malformed remote portsTalvez já em andamento Um pull request vinculado a esta issue está aberto ou já foi mesclado. Aberta
Dificuldade 2/5 Meio dia Facilidade para iniciantes 62/100
php/php-src#25137 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Bug Status: Needs Triage
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 64/100
Mantenedores costumam responder em até 1 dia
-
quoted_printable_encode() produces lines longer than 76 characters for bytes 0xF5 to 0xFFTalvez já em andamento Um pull request vinculado a esta issue está aberto ou já foi mesclado. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
Mantenedores costumam responder em até 1 dia
Todas as issues de php/php-src
Issues semelhantes
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
-
not for AI lovers
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
OSGeo/gdal#15515 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Template: Bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 83/100
betaflight/betaflight#16014 ·
Mantenedores costumam responder em até 3 dias
-
Dificuldade 1/5 Menos de uma hora Facilidade para iniciantes 75/100
ly05010419/MacNativeGames#2119 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100