blob: e423470036558fe186914e754c7e0f98c571ee55 [file] [log] [blame]
Victor Stinnered3b0bc2013-11-23 12:27:24 +01001:mod:`tracemalloc` --- Trace memory allocations
2===============================================
3
4.. module:: tracemalloc
5 :synopsis: Trace memory allocations.
6
R David Murray6d5cb072013-12-20 14:48:50 -05007.. versionadded:: 3.4
8
Terry Jan Reedyfa089b92016-06-11 15:02:54 -04009**Source code:** :source:`Lib/tracemalloc.py`
10
11--------------
12
Victor Stinnered3b0bc2013-11-23 12:27:24 +010013The tracemalloc module is a debug tool to trace memory blocks allocated by
14Python. It provides the following information:
15
16* Traceback where an object was allocated
17* Statistics on allocated memory blocks per filename and per line number:
18 total size, number and average size of allocated memory blocks
19* Compute the differences between two snapshots to detect memory leaks
20
21To trace most memory blocks allocated by Python, the module should be started
22as early as possible by setting the :envvar:`PYTHONTRACEMALLOC` environment
23variable to ``1``, or by using :option:`-X` ``tracemalloc`` command line
24option. The :func:`tracemalloc.start` function can be called at runtime to
25start tracing Python memory allocations.
26
27By default, a trace of an allocated memory block only stores the most recent
28frame (1 frame). To store 25 frames at startup: set the
29:envvar:`PYTHONTRACEMALLOC` environment variable to ``25``, or use the
Victor Stinner3728d6c2013-11-23 12:37:20 +010030:option:`-X` ``tracemalloc=25`` command line option.
Victor Stinnered3b0bc2013-11-23 12:27:24 +010031
Victor Stinnered3b0bc2013-11-23 12:27:24 +010032
33Examples
Georg Brandl717e0282014-10-31 10:21:07 +010034--------
Victor Stinnered3b0bc2013-11-23 12:27:24 +010035
36Display the top 10
Georg Brandl717e0282014-10-31 10:21:07 +010037^^^^^^^^^^^^^^^^^^
Victor Stinnered3b0bc2013-11-23 12:27:24 +010038
39Display the 10 files allocating the most memory::
40
41 import tracemalloc
42
43 tracemalloc.start()
44
45 # ... run your application ...
46
47 snapshot = tracemalloc.take_snapshot()
48 top_stats = snapshot.statistics('lineno')
49
50 print("[ Top 10 ]")
51 for stat in top_stats[:10]:
52 print(stat)
53
54
55Example of output of the Python test suite::
56
57 [ Top 10 ]
58 <frozen importlib._bootstrap>:716: size=4855 KiB, count=39328, average=126 B
59 <frozen importlib._bootstrap>:284: size=521 KiB, count=3199, average=167 B
60 /usr/lib/python3.4/collections/__init__.py:368: size=244 KiB, count=2315, average=108 B
61 /usr/lib/python3.4/unittest/case.py:381: size=185 KiB, count=779, average=243 B
62 /usr/lib/python3.4/unittest/case.py:402: size=154 KiB, count=378, average=416 B
63 /usr/lib/python3.4/abc.py:133: size=88.7 KiB, count=347, average=262 B
64 <frozen importlib._bootstrap>:1446: size=70.4 KiB, count=911, average=79 B
65 <frozen importlib._bootstrap>:1454: size=52.0 KiB, count=25, average=2131 B
66 <string>:5: size=49.7 KiB, count=148, average=344 B
67 /usr/lib/python3.4/sysconfig.py:411: size=48.0 KiB, count=1, average=48.0 KiB
68
Victor Stinner440d7032016-12-30 02:14:59 +010069We can see that Python loaded ``4855 KiB`` data (bytecode and constants) from
Victor Stinnered3b0bc2013-11-23 12:27:24 +010070modules and that the :mod:`collections` module allocated ``244 KiB`` to build
71:class:`~collections.namedtuple` types.
72
73See :meth:`Snapshot.statistics` for more options.
74
75
76Compute differences
Georg Brandl717e0282014-10-31 10:21:07 +010077^^^^^^^^^^^^^^^^^^^
Victor Stinnered3b0bc2013-11-23 12:27:24 +010078
79Take two snapshots and display the differences::
80
81 import tracemalloc
82 tracemalloc.start()
83 # ... start your application ...
84
85 snapshot1 = tracemalloc.take_snapshot()
86 # ... call the function leaking memory ...
87 snapshot2 = tracemalloc.take_snapshot()
88
89 top_stats = snapshot2.compare_to(snapshot1, 'lineno')
90
91 print("[ Top 10 differences ]")
92 for stat in top_stats[:10]:
93 print(stat)
94
95Example of output before/after running some tests of the Python test suite::
96
97 [ Top 10 differences ]
98 <frozen importlib._bootstrap>:716: size=8173 KiB (+4428 KiB), count=71332 (+39369), average=117 B
99 /usr/lib/python3.4/linecache.py:127: size=940 KiB (+940 KiB), count=8106 (+8106), average=119 B
100 /usr/lib/python3.4/unittest/case.py:571: size=298 KiB (+298 KiB), count=589 (+589), average=519 B
101 <frozen importlib._bootstrap>:284: size=1005 KiB (+166 KiB), count=7423 (+1526), average=139 B
102 /usr/lib/python3.4/mimetypes.py:217: size=112 KiB (+112 KiB), count=1334 (+1334), average=86 B
103 /usr/lib/python3.4/http/server.py:848: size=96.0 KiB (+96.0 KiB), count=1 (+1), average=96.0 KiB
104 /usr/lib/python3.4/inspect.py:1465: size=83.5 KiB (+83.5 KiB), count=109 (+109), average=784 B
105 /usr/lib/python3.4/unittest/mock.py:491: size=77.7 KiB (+77.7 KiB), count=143 (+143), average=557 B
106 /usr/lib/python3.4/urllib/parse.py:476: size=71.8 KiB (+71.8 KiB), count=969 (+969), average=76 B
107 /usr/lib/python3.4/contextlib.py:38: size=67.2 KiB (+67.2 KiB), count=126 (+126), average=546 B
108
Victor Stinner440d7032016-12-30 02:14:59 +0100109We can see that Python has loaded ``8173 KiB`` of module data (bytecode and
110constants), and that this is ``4428 KiB`` more than had been loaded before the
Victor Stinner00773df2013-11-26 00:40:10 +0100111tests, when the previous snapshot was taken. Similarly, the :mod:`linecache`
112module has cached ``940 KiB`` of Python source code to format tracebacks, all
113of it since the previous snapshot.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100114
115If the system has little free memory, snapshots can be written on disk using
116the :meth:`Snapshot.dump` method to analyze the snapshot offline. Then use the
117:meth:`Snapshot.load` method reload the snapshot.
118
119
120Get the traceback of a memory block
Georg Brandl717e0282014-10-31 10:21:07 +0100121^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100122
123Code to display the traceback of the biggest memory block::
124
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100125 import tracemalloc
126
Victor Stinner3728d6c2013-11-23 12:37:20 +0100127 # Store 25 frames
128 tracemalloc.start(25)
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100129
130 # ... run your application ...
131
132 snapshot = tracemalloc.take_snapshot()
133 top_stats = snapshot.statistics('traceback')
134
135 # pick the biggest memory block
136 stat = top_stats[0]
137 print("%s memory blocks: %.1f KiB" % (stat.count, stat.size / 1024))
Victor Stinner23f628d2014-02-16 23:53:38 +0100138 for line in stat.traceback.format():
139 print(line)
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100140
141Example of output of the Python test suite (traceback limited to 25 frames)::
142
143 903 memory blocks: 870.1 KiB
144 File "<frozen importlib._bootstrap>", line 716
145 File "<frozen importlib._bootstrap>", line 1036
146 File "<frozen importlib._bootstrap>", line 934
147 File "<frozen importlib._bootstrap>", line 1068
148 File "<frozen importlib._bootstrap>", line 619
149 File "<frozen importlib._bootstrap>", line 1581
150 File "<frozen importlib._bootstrap>", line 1614
151 File "/usr/lib/python3.4/doctest.py", line 101
152 import pdb
153 File "<frozen importlib._bootstrap>", line 284
154 File "<frozen importlib._bootstrap>", line 938
155 File "<frozen importlib._bootstrap>", line 1068
156 File "<frozen importlib._bootstrap>", line 619
157 File "<frozen importlib._bootstrap>", line 1581
158 File "<frozen importlib._bootstrap>", line 1614
159 File "/usr/lib/python3.4/test/support/__init__.py", line 1728
160 import doctest
161 File "/usr/lib/python3.4/test/test_pickletools.py", line 21
162 support.run_doctest(pickletools)
163 File "/usr/lib/python3.4/test/regrtest.py", line 1276
164 test_runner()
165 File "/usr/lib/python3.4/test/regrtest.py", line 976
166 display_failure=not verbose)
167 File "/usr/lib/python3.4/test/regrtest.py", line 761
168 match_tests=ns.match_tests)
169 File "/usr/lib/python3.4/test/regrtest.py", line 1563
170 main()
171 File "/usr/lib/python3.4/test/__main__.py", line 3
172 regrtest.main_in_temp_cwd()
173 File "/usr/lib/python3.4/runpy.py", line 73
174 exec(code, run_globals)
175 File "/usr/lib/python3.4/runpy.py", line 160
176 "__main__", fname, loader, pkg_name)
177
Victor Stinner00773df2013-11-26 00:40:10 +0100178We can see that the most memory was allocated in the :mod:`importlib` module to
Victor Stinner440d7032016-12-30 02:14:59 +0100179load data (bytecode and constants) from modules: ``870.1 KiB``. The traceback is
Victor Stinner00773df2013-11-26 00:40:10 +0100180where the :mod:`importlib` loaded data most recently: on the ``import pdb``
181line of the :mod:`doctest` module. The traceback may change if a new module is
182loaded.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100183
184
185Pretty top
Georg Brandl717e0282014-10-31 10:21:07 +0100186^^^^^^^^^^
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100187
188Code to display the 10 lines allocating the most memory with a pretty output,
189ignoring ``<frozen importlib._bootstrap>`` and ``<unknown>`` files::
190
Victor Stinner637d2e92014-03-11 08:12:48 +0100191 import linecache
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100192 import os
193 import tracemalloc
194
Victor Stinner440d7032016-12-30 02:14:59 +0100195 def display_top(snapshot, key_type='lineno', limit=10):
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100196 snapshot = snapshot.filter_traces((
197 tracemalloc.Filter(False, "<frozen importlib._bootstrap>"),
198 tracemalloc.Filter(False, "<unknown>"),
199 ))
Victor Stinner440d7032016-12-30 02:14:59 +0100200 top_stats = snapshot.statistics(key_type)
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100201
202 print("Top %s lines" % limit)
203 for index, stat in enumerate(top_stats[:limit], 1):
204 frame = stat.traceback[0]
205 # replace "/path/to/module/file.py" with "module/file.py"
206 filename = os.sep.join(frame.filename.split(os.sep)[-2:])
207 print("#%s: %s:%s: %.1f KiB"
Victor Stinnerf70200e2014-03-03 11:57:57 +0100208 % (index, filename, frame.lineno, stat.size / 1024))
Victor Stinner637d2e92014-03-11 08:12:48 +0100209 line = linecache.getline(frame.filename, frame.lineno).strip()
210 if line:
211 print(' %s' % line)
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100212
213 other = top_stats[limit:]
214 if other:
215 size = sum(stat.size for stat in other)
216 print("%s other: %.1f KiB" % (len(other), size / 1024))
217 total = sum(stat.size for stat in top_stats)
218 print("Total allocated size: %.1f KiB" % (total / 1024))
219
220 tracemalloc.start()
221
222 # ... run your application ...
223
224 snapshot = tracemalloc.take_snapshot()
Victor Stinnerf70200e2014-03-03 11:57:57 +0100225 display_top(snapshot)
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100226
227Example of output of the Python test suite::
228
Victor Stinner637d2e92014-03-11 08:12:48 +0100229 Top 10 lines
230 #1: Lib/base64.py:414: 419.8 KiB
231 _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars]
232 #2: Lib/base64.py:306: 419.8 KiB
233 _a85chars2 = [(a + b) for a in _a85chars for b in _a85chars]
234 #3: collections/__init__.py:368: 293.6 KiB
235 exec(class_definition, namespace)
236 #4: Lib/abc.py:133: 115.2 KiB
237 cls = super().__new__(mcls, name, bases, namespace)
238 #5: unittest/case.py:574: 103.1 KiB
239 testMethod()
240 #6: Lib/linecache.py:127: 95.4 KiB
241 lines = fp.readlines()
242 #7: urllib/parse.py:476: 71.8 KiB
243 for a in _hexdig for b in _hexdig}
244 #8: <string>:5: 62.0 KiB
245 #9: Lib/_weakrefset.py:37: 60.0 KiB
246 self.data = set()
247 #10: Lib/base64.py:142: 59.8 KiB
248 _b32tab2 = [a + b for a in _b32tab for b in _b32tab]
249 6220 other: 3602.8 KiB
250 Total allocated size: 5303.1 KiB
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100251
252See :meth:`Snapshot.statistics` for more options.
253
254
255API
Georg Brandl717e0282014-10-31 10:21:07 +0100256---
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100257
258Functions
Georg Brandl717e0282014-10-31 10:21:07 +0100259^^^^^^^^^
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100260
261.. function:: clear_traces()
262
263 Clear traces of memory blocks allocated by Python.
264
265 See also :func:`stop`.
266
267
268.. function:: get_object_traceback(obj)
269
270 Get the traceback where the Python object *obj* was allocated.
271 Return a :class:`Traceback` instance, or ``None`` if the :mod:`tracemalloc`
272 module is not tracing memory allocations or did not trace the allocation of
273 the object.
274
275 See also :func:`gc.get_referrers` and :func:`sys.getsizeof` functions.
276
277
278.. function:: get_traceback_limit()
279
280 Get the maximum number of frames stored in the traceback of a trace.
281
Victor Stinner3728d6c2013-11-23 12:37:20 +0100282 The :mod:`tracemalloc` module must be tracing memory allocations to
283 get the limit, otherwise an exception is raised.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100284
Victor Stinner3728d6c2013-11-23 12:37:20 +0100285 The limit is set by the :func:`start` function.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100286
287
288.. function:: get_traced_memory()
289
Victor Stinner3c0481d2013-11-27 21:39:49 +0100290 Get the current size and peak size of memory blocks traced by the
291 :mod:`tracemalloc` module as a tuple: ``(current: int, peak: int)``.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100292
293
294.. function:: get_tracemalloc_memory()
295
296 Get the memory usage in bytes of the :mod:`tracemalloc` module used to store
297 traces of memory blocks.
298 Return an :class:`int`.
299
300
301.. function:: is_tracing()
302
303 ``True`` if the :mod:`tracemalloc` module is tracing Python memory
304 allocations, ``False`` otherwise.
305
306 See also :func:`start` and :func:`stop` functions.
307
308
Victor Stinner3728d6c2013-11-23 12:37:20 +0100309.. function:: start(nframe: int=1)
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100310
Victor Stinner3728d6c2013-11-23 12:37:20 +0100311 Start tracing Python memory allocations: install hooks on Python memory
312 allocators. Collected tracebacks of traces will be limited to *nframe*
313 frames. By default, a trace of a memory block only stores the most recent
314 frame: the limit is ``1``. *nframe* must be greater or equal to ``1``.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100315
Julien Danjou8d59eb12019-10-15 14:00:16 +0200316 You can still read the original number of total frames that composed the
317 traceback by looking at the :attr:`Traceback.total_nframe` attribute.
318
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100319 Storing more than ``1`` frame is only useful to compute statistics grouped
320 by ``'traceback'`` or to compute cumulative statistics: see the
321 :meth:`Snapshot.compare_to` and :meth:`Snapshot.statistics` methods.
322
323 Storing more frames increases the memory and CPU overhead of the
324 :mod:`tracemalloc` module. Use the :func:`get_tracemalloc_memory` function
325 to measure how much memory is used by the :mod:`tracemalloc` module.
326
327 The :envvar:`PYTHONTRACEMALLOC` environment variable
328 (``PYTHONTRACEMALLOC=NFRAME``) and the :option:`-X` ``tracemalloc=NFRAME``
Victor Stinner3728d6c2013-11-23 12:37:20 +0100329 command line option can be used to start tracing at startup.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100330
Victor Stinner3728d6c2013-11-23 12:37:20 +0100331 See also :func:`stop`, :func:`is_tracing` and :func:`get_traceback_limit`
332 functions.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100333
334
335.. function:: stop()
336
337 Stop tracing Python memory allocations: uninstall hooks on Python memory
Victor Stinner00773df2013-11-26 00:40:10 +0100338 allocators. Also clears all previously collected traces of memory blocks
339 allocated by Python.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100340
341 Call :func:`take_snapshot` function to take a snapshot of traces before
342 clearing them.
343
Victor Stinner00773df2013-11-26 00:40:10 +0100344 See also :func:`start`, :func:`is_tracing` and :func:`clear_traces`
345 functions.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100346
347
348.. function:: take_snapshot()
349
350 Take a snapshot of traces of memory blocks allocated by Python. Return a new
351 :class:`Snapshot` instance.
352
353 The snapshot does not include memory blocks allocated before the
354 :mod:`tracemalloc` module started to trace memory allocations.
355
356 Tracebacks of traces are limited to :func:`get_traceback_limit` frames. Use
Victor Stinner3728d6c2013-11-23 12:37:20 +0100357 the *nframe* parameter of the :func:`start` function to store more frames.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100358
359 The :mod:`tracemalloc` module must be tracing memory allocations to take a
Donald Stufft8b852f12014-05-20 12:58:38 -0400360 snapshot, see the :func:`start` function.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100361
362 See also the :func:`get_object_traceback` function.
363
364
Victor Stinnere492ae52016-03-22 12:58:23 +0100365DomainFilter
366^^^^^^^^^^^^
367
368.. class:: DomainFilter(inclusive: bool, domain: int)
369
370 Filter traces of memory blocks by their address space (domain).
371
372 .. versionadded:: 3.6
373
374 .. attribute:: inclusive
375
376 If *inclusive* is ``True`` (include), match memory blocks allocated
377 in the address space :attr:`domain`.
378
379 If *inclusive* is ``False`` (exclude), match memory blocks not allocated
380 in the address space :attr:`domain`.
381
382 .. attribute:: domain
383
384 Address space of a memory block (``int``). Read-only property.
385
386
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100387Filter
Georg Brandl717e0282014-10-31 10:21:07 +0100388^^^^^^
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100389
Victor Stinnere492ae52016-03-22 12:58:23 +0100390.. class:: Filter(inclusive: bool, filename_pattern: str, lineno: int=None, all_frames: bool=False, domain: int=None)
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100391
392 Filter on traces of memory blocks.
393
394 See the :func:`fnmatch.fnmatch` function for the syntax of
Brett Cannonf299abd2015-04-13 14:21:02 -0400395 *filename_pattern*. The ``'.pyc'`` file extension is
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100396 replaced with ``'.py'``.
397
398 Examples:
399
400 * ``Filter(True, subprocess.__file__)`` only includes traces of the
401 :mod:`subprocess` module
402 * ``Filter(False, tracemalloc.__file__)`` excludes traces of the
403 :mod:`tracemalloc` module
404 * ``Filter(False, "<unknown>")`` excludes empty tracebacks
405
Brett Cannonf299abd2015-04-13 14:21:02 -0400406
407 .. versionchanged:: 3.5
408 The ``'.pyo'`` file extension is no longer replaced with ``'.py'``.
409
Victor Stinnere492ae52016-03-22 12:58:23 +0100410 .. versionchanged:: 3.6
411 Added the :attr:`domain` attribute.
412
413
414 .. attribute:: domain
415
416 Address space of a memory block (``int`` or ``None``).
417
Victor Stinner5ea4c062017-06-20 17:46:36 +0200418 tracemalloc uses the domain ``0`` to trace memory allocations made by
419 Python. C extensions can use other domains to trace other resources.
420
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100421 .. attribute:: inclusive
422
Victor Stinnere492ae52016-03-22 12:58:23 +0100423 If *inclusive* is ``True`` (include), only match memory blocks allocated
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100424 in a file with a name matching :attr:`filename_pattern` at line number
425 :attr:`lineno`.
426
427 If *inclusive* is ``False`` (exclude), ignore memory blocks allocated in
428 a file with a name matching :attr:`filename_pattern` at line number
429 :attr:`lineno`.
430
431 .. attribute:: lineno
432
433 Line number (``int``) of the filter. If *lineno* is ``None``, the filter
434 matches any line number.
435
436 .. attribute:: filename_pattern
437
Victor Stinnere492ae52016-03-22 12:58:23 +0100438 Filename pattern of the filter (``str``). Read-only property.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100439
440 .. attribute:: all_frames
441
442 If *all_frames* is ``True``, all frames of the traceback are checked. If
443 *all_frames* is ``False``, only the most recent frame is checked.
444
Victor Stinner5362abf2013-11-27 23:39:55 +0100445 This attribute has no effect if the traceback limit is ``1``. See the
446 :func:`get_traceback_limit` function and :attr:`Snapshot.traceback_limit`
447 attribute.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100448
449
450Frame
Georg Brandl717e0282014-10-31 10:21:07 +0100451^^^^^
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100452
453.. class:: Frame
454
455 Frame of a traceback.
456
457 The :class:`Traceback` class is a sequence of :class:`Frame` instances.
458
459 .. attribute:: filename
460
461 Filename (``str``).
462
463 .. attribute:: lineno
464
465 Line number (``int``).
466
467
468Snapshot
Georg Brandl717e0282014-10-31 10:21:07 +0100469^^^^^^^^
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100470
471.. class:: Snapshot
472
473 Snapshot of traces of memory blocks allocated by Python.
474
475 The :func:`take_snapshot` function creates a snapshot instance.
476
Victor Stinner440d7032016-12-30 02:14:59 +0100477 .. method:: compare_to(old_snapshot: Snapshot, key_type: str, cumulative: bool=False)
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100478
479 Compute the differences with an old snapshot. Get statistics as a sorted
Victor Stinner440d7032016-12-30 02:14:59 +0100480 list of :class:`StatisticDiff` instances grouped by *key_type*.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100481
Victor Stinner440d7032016-12-30 02:14:59 +0100482 See the :meth:`Snapshot.statistics` method for *key_type* and *cumulative*
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100483 parameters.
484
485 The result is sorted from the biggest to the smallest by: absolute value
486 of :attr:`StatisticDiff.size_diff`, :attr:`StatisticDiff.size`, absolute
487 value of :attr:`StatisticDiff.count_diff`, :attr:`Statistic.count` and
488 then by :attr:`StatisticDiff.traceback`.
489
490
491 .. method:: dump(filename)
492
493 Write the snapshot into a file.
494
495 Use :meth:`load` to reload the snapshot.
496
497
498 .. method:: filter_traces(filters)
499
500 Create a new :class:`Snapshot` instance with a filtered :attr:`traces`
Victor Stinnere492ae52016-03-22 12:58:23 +0100501 sequence, *filters* is a list of :class:`DomainFilter` and
502 :class:`Filter` instances. If *filters* is an empty list, return a new
503 :class:`Snapshot` instance with a copy of the traces.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100504
505 All inclusive filters are applied at once, a trace is ignored if no
506 inclusive filters match it. A trace is ignored if at least one exclusive
Martin Panter1f1177d2015-10-31 11:48:53 +0000507 filter matches it.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100508
Victor Stinnere492ae52016-03-22 12:58:23 +0100509 .. versionchanged:: 3.6
510 :class:`DomainFilter` instances are now also accepted in *filters*.
511
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100512
513 .. classmethod:: load(filename)
514
515 Load a snapshot from a file.
516
517 See also :meth:`dump`.
518
519
Victor Stinner440d7032016-12-30 02:14:59 +0100520 .. method:: statistics(key_type: str, cumulative: bool=False)
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100521
522 Get statistics as a sorted list of :class:`Statistic` instances grouped
Victor Stinner440d7032016-12-30 02:14:59 +0100523 by *key_type*:
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100524
525 ===================== ========================
Victor Stinner440d7032016-12-30 02:14:59 +0100526 key_type description
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100527 ===================== ========================
528 ``'filename'`` filename
529 ``'lineno'`` filename and line number
530 ``'traceback'`` traceback
531 ===================== ========================
532
533 If *cumulative* is ``True``, cumulate size and count of memory blocks of
534 all frames of the traceback of a trace, not only the most recent frame.
Victor Stinner440d7032016-12-30 02:14:59 +0100535 The cumulative mode can only be used with *key_type* equals to
Victor Stinner8e3708d2013-11-26 00:45:47 +0100536 ``'filename'`` and ``'lineno'``.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100537
538 The result is sorted from the biggest to the smallest by:
539 :attr:`Statistic.size`, :attr:`Statistic.count` and then by
540 :attr:`Statistic.traceback`.
541
542
543 .. attribute:: traceback_limit
544
545 Maximum number of frames stored in the traceback of :attr:`traces`:
546 result of the :func:`get_traceback_limit` when the snapshot was taken.
547
548 .. attribute:: traces
549
550 Traces of all memory blocks allocated by Python: sequence of
551 :class:`Trace` instances.
552
553 The sequence has an undefined order. Use the :meth:`Snapshot.statistics`
554 method to get a sorted list of statistics.
555
556
557Statistic
Georg Brandl717e0282014-10-31 10:21:07 +0100558^^^^^^^^^
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100559
560.. class:: Statistic
561
562 Statistic on memory allocations.
563
564 :func:`Snapshot.statistics` returns a list of :class:`Statistic` instances.
565
566 See also the :class:`StatisticDiff` class.
567
568 .. attribute:: count
569
570 Number of memory blocks (``int``).
571
572 .. attribute:: size
573
574 Total size of memory blocks in bytes (``int``).
575
576 .. attribute:: traceback
577
578 Traceback where the memory block was allocated, :class:`Traceback`
579 instance.
580
581
582StatisticDiff
Georg Brandl717e0282014-10-31 10:21:07 +0100583^^^^^^^^^^^^^
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100584
585.. class:: StatisticDiff
586
587 Statistic difference on memory allocations between an old and a new
588 :class:`Snapshot` instance.
589
590 :func:`Snapshot.compare_to` returns a list of :class:`StatisticDiff`
591 instances. See also the :class:`Statistic` class.
592
593 .. attribute:: count
594
595 Number of memory blocks in the new snapshot (``int``): ``0`` if
596 the memory blocks have been released in the new snapshot.
597
598 .. attribute:: count_diff
599
600 Difference of number of memory blocks between the old and the new
601 snapshots (``int``): ``0`` if the memory blocks have been allocated in
602 the new snapshot.
603
604 .. attribute:: size
605
606 Total size of memory blocks in bytes in the new snapshot (``int``):
607 ``0`` if the memory blocks have been released in the new snapshot.
608
609 .. attribute:: size_diff
610
611 Difference of total size of memory blocks in bytes between the old and
612 the new snapshots (``int``): ``0`` if the memory blocks have been
613 allocated in the new snapshot.
614
615 .. attribute:: traceback
616
617 Traceback where the memory blocks were allocated, :class:`Traceback`
618 instance.
619
620
621Trace
Georg Brandl717e0282014-10-31 10:21:07 +0100622^^^^^
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100623
624.. class:: Trace
625
626 Trace of a memory block.
627
628 The :attr:`Snapshot.traces` attribute is a sequence of :class:`Trace`
629 instances.
630
Victor Stinner5ea4c062017-06-20 17:46:36 +0200631 .. versionchanged:: 3.6
632 Added the :attr:`domain` attribute.
633
634 .. attribute:: domain
635
636 Address space of a memory block (``int``). Read-only property.
637
638 tracemalloc uses the domain ``0`` to trace memory allocations made by
639 Python. C extensions can use other domains to trace other resources.
640
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100641 .. attribute:: size
642
643 Size of the memory block in bytes (``int``).
644
645 .. attribute:: traceback
646
647 Traceback where the memory block was allocated, :class:`Traceback`
648 instance.
649
650
651Traceback
Georg Brandl717e0282014-10-31 10:21:07 +0100652^^^^^^^^^
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100653
654.. class:: Traceback
655
Jesse-Bakker706e10b2017-11-30 00:05:07 +0100656 Sequence of :class:`Frame` instances sorted from the oldest frame to the
657 most recent frame.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100658
659 A traceback contains at least ``1`` frame. If the ``tracemalloc`` module
660 failed to get a frame, the filename ``"<unknown>"`` at line number ``0`` is
661 used.
662
663 When a snapshot is taken, tracebacks of traces are limited to
664 :func:`get_traceback_limit` frames. See the :func:`take_snapshot` function.
Julien Danjou8d59eb12019-10-15 14:00:16 +0200665 The original number of frames of the traceback is stored in the
666 :attr:`Traceback.total_nframe` attribute. That allows to know if a traceback
667 has been truncated by the traceback limit.
Victor Stinnered3b0bc2013-11-23 12:27:24 +0100668
669 The :attr:`Trace.traceback` attribute is an instance of :class:`Traceback`
670 instance.
671
Jesse-Bakker706e10b2017-11-30 00:05:07 +0100672 .. versionchanged:: 3.7
673 Frames are now sorted from the oldest to the most recent, instead of most recent to oldest.
Victor Stinner23f628d2014-02-16 23:53:38 +0100674
Julien Danjou8d59eb12019-10-15 14:00:16 +0200675 .. attribute:: total_nframe
676
677 Total number of frames that composed the traceback before truncation.
678 This attribute can be set to ``None`` if the information is not
679 available.
680
681 .. versionchanged:: 3.9
682 The :attr:`Traceback.total_nframe` attribute was added.
683
Jesse-Bakker706e10b2017-11-30 00:05:07 +0100684 .. method:: format(limit=None, most_recent_first=False)
685
686 Format the traceback as a list of lines with newlines. Use the
687 :mod:`linecache` module to retrieve lines from the source code.
688 If *limit* is set, format the *limit* most recent frames if *limit*
689 is positive. Otherwise, format the ``abs(limit)`` oldest frames.
690 If *most_recent_first* is ``True``, the order of the formatted frames
691 is reversed, returning the most recent frame first instead of last.
Victor Stinner23f628d2014-02-16 23:53:38 +0100692
693 Similar to the :func:`traceback.format_tb` function, except that
Martin Panterd5db1472016-02-08 01:34:09 +0000694 :meth:`.format` does not include newlines.
Victor Stinner23f628d2014-02-16 23:53:38 +0100695
696 Example::
697
698 print("Traceback (most recent call first):")
699 for line in traceback:
700 print(line)
701
702 Output::
703
704 Traceback (most recent call first):
705 File "test.py", line 9
706 obj = Object()
707 File "test.py", line 12
708 tb = tracemalloc.get_object_traceback(f())