gh-108362: Retarget incremental GC changes to 3.14 (#125453)

This commit is contained in:
Hugo van Kemenade 2025-07-20 12:56:55 +03:00 committed by GitHub
parent 588d9fb84a
commit dda9d0011f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 75 additions and 4 deletions

View file

@ -60,7 +60,7 @@ The :mod:`gc` module provides the following functions:
The effect of calling ``gc.collect()`` while the interpreter is already
performing a collection is undefined.
.. versionchanged:: 3.13
.. versionchanged:: 3.14
``generation=1`` performs an increment of collection.
@ -83,13 +83,13 @@ The :mod:`gc` module provides the following functions:
returned. If *generation* is not ``None``, return only the objects as follows:
* 0: All objects in the young generation
* 1: No objects, as there is no generation 1 (as of Python 3.13)
* 1: No objects, as there is no generation 1 (as of Python 3.14)
* 2: All objects in the old generation
.. versionchanged:: 3.8
New *generation* parameter.
.. versionchanged:: 3.13
.. versionchanged:: 3.14
Generation 1 is removed
.. audit-event:: gc.get_objects generation gc.get_objects
@ -142,7 +142,7 @@ The :mod:`gc` module provides the following functions:
See `Garbage collector design <https://devguide.python.org/garbage_collector>`_ for more information.
.. versionchanged:: 3.13
.. versionchanged:: 3.14
*threshold2* is ignored

View file

@ -1058,6 +1058,30 @@ free-threaded build and false for the GIL-enabled build.
(Contributed by Neil Schemenauer and Kumar Aditya in :gh:`130010`.)
.. _whatsnew314-incremental-gc:
Incremental garbage collection
------------------------------
The cycle garbage collector is now incremental.
This means that maximum pause times are reduced
by an order of magnitude or more for larger heaps.
There are now only two generations: young and old.
When :func:`gc.collect` is not called directly, the
GC is invoked a little less frequently. When invoked, it
collects the young generation and an increment of the
old generation, instead of collecting one or more generations.
The behavior of :func:`!gc.collect` changes slightly:
* ``gc.collect(1)``: Performs an increment of garbage collection,
rather than collecting generation 1.
* Other calls to :func:`!gc.collect` are unchanged.
(Contributed by Mark Shannon in :gh:`108362`.)
Other language changes
======================
@ -1486,6 +1510,36 @@ functools
(Contributed by Sayandip Dutta in :gh:`125916`.)
gc
--
The cyclic garbage collector is now incremental,
which changes the meaning of the results of
:meth:`~gc.get_threshold` and :meth:`~gc.set_threshold`
as well as :meth:`~gc.get_count` and :meth:`~gc.get_stats`.
* For backwards compatibility, :meth:`~gc.get_threshold` continues to return
a three-item tuple.
The first value is the threshold for young collections, as before;
the second value determines the rate at which the old collection is scanned
(the default is 10, and higher values mean that the old collection
is scanned more slowly).
The third value is meaningless and is always zero.
* :meth:`~gc.set_threshold` ignores any items after the second.
* :meth:`~gc.get_count` and :meth:`~gc.get_stats` continue to return
the same format of results.
The only difference is that instead of the results referring to
the young, aging and old generations,
the results refer to the young generation
and the aging and collecting spaces of the old generation.
In summary, code that attempted to manipulate the behavior of the cycle GC
may not work exactly as intended, but it is very unlikely to be harmful.
All other code will work just fine.
getopt
------
@ -2233,6 +2287,7 @@ asyncio
(Contributed by Yury Selivanov, Pablo Galindo Salgado, and Łukasz Langa
in :gh:`91048`.)
base64
------
@ -2241,6 +2296,15 @@ base64
(Contributed by Bénédikt Tran, Chris Markiewicz, and Adam Turner in :gh:`118761`.)
gc
--
* The new :ref:`incremental garbage collector <whatsnew314-incremental-gc>`
means that maximum pause times are reduced
by an order of magnitude or more for larger heaps.
(Contributed by Mark Shannon in :gh:`108362`.)
io
---
* :mod:`io` which provides the built-in :func:`open` makes less system calls
@ -2707,6 +2771,13 @@ Changes in the Python API
Wrap it in :func:`staticmethod` if you want to preserve the old behavior.
(Contributed by Serhiy Storchaka and Dominykas Grigonis in :gh:`121027`.)
* The :ref:`garbage collector is now incremental <whatsnew314-incremental-gc>`,
which means that the behavior of :func:`gc.collect` changes slightly:
* ``gc.collect(1)``: Performs an increment of garbage collection,
rather than collecting generation 1.
* Other calls to :func:`!gc.collect` are unchanged.
* The :func:`locale.nl_langinfo` function now sets temporarily the ``LC_CTYPE``
locale in some cases.
This temporary change affects other threads.