]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-108362: Retarget incremental GC changes to 3.14 (#125453)
authorHugo van Kemenade <1324225+hugovk@users.noreply.github.com>
Sun, 20 Jul 2025 09:56:55 +0000 (12:56 +0300)
committerGitHub <noreply@github.com>
Sun, 20 Jul 2025 09:56:55 +0000 (12:56 +0300)
Doc/library/gc.rst
Doc/whatsnew/3.14.rst

index 7ccb0e6bdf9406e2a449c0e13e5c3f98485baaa2..2ef5c4b35a25cc050b32a82f05a11f75fa26307e 100644 (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
 
 
index c108a94692dca70d41d6fb59e4a6e2e8becb9dda..6ddc77d8f950384339264bc60bfaffad5ad67f2b 100644 (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.