-
-
Notifications
You must be signed in to change notification settings - Fork 33.4k
Description
Bug report
Bug description:
There is some inconsistency in handling of immortal objects in default-build's GC.
In update_refs immortal objects just untracked (all immortal objects that we face in GC is an accidentally immortalized).
Lines 495 to 500 in 1e69cd1
| if (_Py_IsImmortal(op)) { | |
| assert(!_Py_IsStaticImmortal(op)); | |
| _PyObject_GC_UNTRACK(op); | |
| gc = next; | |
| continue; | |
| } |
update_refs called for all collections (young, increment and full). But for incremental collection if increment_size < gcstate->work_to_do we steal some objects from neighbor gen and call expand_region_transitively_reachable where immortal objects moved to permanent generation:
Lines 1397 to 1402 in 1e69cd1
| if (_Py_IsImmortal(op)) { | |
| PyGC_Head *next = GC_NEXT(gc); | |
| gc_list_move(gc, &gcstate->permanent_generation.head); | |
| gc = next; | |
| continue; | |
| } |
So, one part of immortal objects can be untracked, and other part can be moved to perm gen.
As I understand from #127519 it is preferring to untrack immortal objects in all cases.
CPython versions tested on:
CPython main branch
Operating systems tested on:
No response