Closed as not planned
Description
Bug report
Bug description:
Since 67807cf, _testembed.exe
(x64 Release) increases the memory usage in the cycle of Py_Initialize
and Py_Finalize
.
I monitored the Task Manager (taskmgr.exe
) on Windows10/11, with a change against Programs/_testembed.c
:
- #define INIT_LOOPS 4 + #define INIT_LOOPS 200
Commands:
_testembed.exe test_repeated_simple_init
orpython -m test test_embed -m test_simple_initialization_api
(no log)
With RADIX TREE (as-is)
Loop | 67807cf | main | 3.11.7 |
---|---|---|---|
100 | 67MB | 210MB | 4MB |
200 | 135MB | 406MB | 4MB |
No RADIX TREE (as-is)
Loop | 67807cf | main | 3.11.7 |
---|---|---|---|
100 | 10MB | 168MB | 4MB |
200 | 16MB | 336MB | 4MB |
Recent obmalloc.c
looks ready for finalization. Just adding my rough (invalid?) experiment made the leaks even. So, I hope that they share the same issue. Otherwise, ea2c001 or 15d4c9f has another leak. #98359 (comment)
patch
void _PyInterpreterState_FinalizeAllocatedBlocks(PyInterpreterState *interp) { if (has_own_state(interp)) { Py_ssize_t leaked = _PyInterpreterState_GetAllocatedBlocks(interp); assert(has_own_state(interp) || leaked == 0); interp->runtime->obmalloc.interpreter_leaks += leaked; + OMState *state = &interp->obmalloc; + for (uint i = 0; i < maxarenas; ++i) { + if (allarenas[i].address == 0) { + continue; + } + _PyObject_Arena.free(_PyObject_Arena.ctx, + (void *)allarenas[i].address, ARENA_SIZE); + allarenas[i].address = 0; + --narenas_currently_allocated; + } + PyMem_RawFree(allarenas); } }
With RADIX TREE (patched)
Loop | 67807cf | main |
---|---|---|
100 | 42MB | 40MB |
200 | 80MB | 80MB |
No RADIX TREE (patched)
Loop | 67807cf | main |
---|---|---|
100 | 3.5M | 3.3M |
200 | 3.7M | 3.4M |
cc @ericsnowcurrently @nascheme
CPython versions tested on:
3.12, 3.13, CPython main branch: 3aea6c4
Operating systems tested on:
Windows
Linked PRs
Metadata
Metadata
Assignees
Projects
Status
Done