bpo-1635741: Fix refleaks of encodings module by removing the encodings._aliases#21896
bpo-1635741: Fix refleaks of encodings module by removing the encodings._aliases#21896shihai1991 wants to merge 4 commits into
Conversation
|
I use the test case of https://bugs.python.org/issue1635741#msg355187 to test the refleaks in debug mode. Before this PR: After this PR: |
Sorry, something went wrong.
|
@vstinner Hi, victor. Pls take a look if you have free time, thanks. |
Sorry, something went wrong.
vstinner
left a comment
There was a problem hiding this comment.
I don't see how using encodings._aliases in search_function() creates a "reference leak". A leak is when calling a function multiple times leaks memory. Here, there is no leak.
Maybe you're talking about a "reference cycle".
I guess that you're trying to clear variables at exit.
You should try to trigger an explicit GC collection after calling PyInterpreterState_Clear(). In finalize_interp_clear(), try to replace:
/* Trigger a GC collection on subinterpreters*/
if (!is_main_interp) {
_PyGC_CollectNoFail();
}
with:
// Last explicit GC collection
_PyGC_CollectNoFail();
(without this change)
Does it fix your issue?
PyInterpreterState_Clear() clears the reference to the search function: Py_CLEAR(interp->codec_search_path).
Sorry, something went wrong.
Thanks, victor. "reference cycle" would be more exact. And I will try your idea in my interpreter. |
Sorry, something went wrong.
Oh, amazing result: sys.gettotalrefcount: 10537 the pr in: #21902 |
Sorry, something went wrong.
|
Pablo created this PR(don't calling explict collection in main interpreter): #17457 |
Sorry, something went wrong.
|
Since #17457 is merged, is this PR still relevant/useless? If not, please close it. |
Sorry, something went wrong.
Fix refleaks of
encodings._aliasesby usingencodings.aliasesdirectly inencodings.search_function.Co-authored-by: Victor Stinner vstinner@python.org
https://bugs.python.org/issue1635741