• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1:mod:`tracemalloc` --- Trace memory allocations
2===============================================
3
4.. module:: tracemalloc
5   :synopsis: Trace memory allocations.
6
7.. versionadded:: 3.4
8
9**Source code:** :source:`Lib/tracemalloc.py`
10
11--------------
12
13The 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
30:option:`-X` ``tracemalloc=25`` command line option.
31
32
33Examples
34--------
35
36Display the top 10
37^^^^^^^^^^^^^^^^^^
38
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
69We can see that Python loaded ``4855 KiB`` data (bytecode and constants) from
70modules 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
77^^^^^^^^^^^^^^^^^^^
78
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
109We 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
111tests, 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.
114
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
121^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
122
123Code to display the traceback of the biggest memory block::
124
125    import tracemalloc
126
127    # Store 25 frames
128    tracemalloc.start(25)
129
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))
138    for line in stat.traceback.format():
139        print(line)
140
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
178We can see that the most memory was allocated in the :mod:`importlib` module to
179load data (bytecode and constants) from modules: ``870.1 KiB``. The traceback is
180where 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.
183
184
185Pretty top
186^^^^^^^^^^
187
188Code to display the 10 lines allocating the most memory with a pretty output,
189ignoring ``<frozen importlib._bootstrap>`` and ``<unknown>`` files::
190
191    import linecache
192    import os
193    import tracemalloc
194
195    def display_top(snapshot, key_type='lineno', limit=10):
196        snapshot = snapshot.filter_traces((
197            tracemalloc.Filter(False, "<frozen importlib._bootstrap>"),
198            tracemalloc.Filter(False, "<unknown>"),
199        ))
200        top_stats = snapshot.statistics(key_type)
201
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"
208                  % (index, filename, frame.lineno, stat.size / 1024))
209            line = linecache.getline(frame.filename, frame.lineno).strip()
210            if line:
211                print('    %s' % line)
212
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()
225    display_top(snapshot)
226
227Example of output of the Python test suite::
228
229    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
251
252See :meth:`Snapshot.statistics` for more options.
253
254
255API
256---
257
258Functions
259^^^^^^^^^
260
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
282   The :mod:`tracemalloc` module must be tracing memory allocations to
283   get the limit, otherwise an exception is raised.
284
285   The limit is set by the :func:`start` function.
286
287
288.. function:: get_traced_memory()
289
290   Get the current size and peak size of memory blocks traced by the
291   :mod:`tracemalloc` module as a tuple: ``(current: int, peak: int)``.
292
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
309.. function:: start(nframe: int=1)
310
311   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``.
315
316   Storing more than ``1`` frame is only useful to compute statistics grouped
317   by ``'traceback'`` or to compute cumulative statistics: see the
318   :meth:`Snapshot.compare_to` and :meth:`Snapshot.statistics` methods.
319
320   Storing more frames increases the memory and CPU overhead of the
321   :mod:`tracemalloc` module. Use the :func:`get_tracemalloc_memory` function
322   to measure how much memory is used by the :mod:`tracemalloc` module.
323
324   The :envvar:`PYTHONTRACEMALLOC` environment variable
325   (``PYTHONTRACEMALLOC=NFRAME``) and the :option:`-X` ``tracemalloc=NFRAME``
326   command line option can be used to start tracing at startup.
327
328   See also :func:`stop`, :func:`is_tracing` and :func:`get_traceback_limit`
329   functions.
330
331
332.. function:: stop()
333
334   Stop tracing Python memory allocations: uninstall hooks on Python memory
335   allocators. Also clears all previously collected traces of memory blocks
336   allocated by Python.
337
338   Call :func:`take_snapshot` function to take a snapshot of traces before
339   clearing them.
340
341   See also :func:`start`, :func:`is_tracing` and :func:`clear_traces`
342   functions.
343
344
345.. function:: take_snapshot()
346
347   Take a snapshot of traces of memory blocks allocated by Python. Return a new
348   :class:`Snapshot` instance.
349
350   The snapshot does not include memory blocks allocated before the
351   :mod:`tracemalloc` module started to trace memory allocations.
352
353   Tracebacks of traces are limited to :func:`get_traceback_limit` frames. Use
354   the *nframe* parameter of the :func:`start` function to store more frames.
355
356   The :mod:`tracemalloc` module must be tracing memory allocations to take a
357   snapshot, see the :func:`start` function.
358
359   See also the :func:`get_object_traceback` function.
360
361
362DomainFilter
363^^^^^^^^^^^^
364
365.. class:: DomainFilter(inclusive: bool, domain: int)
366
367   Filter traces of memory blocks by their address space (domain).
368
369   .. versionadded:: 3.6
370
371   .. attribute:: inclusive
372
373      If *inclusive* is ``True`` (include), match memory blocks allocated
374      in the address space :attr:`domain`.
375
376      If *inclusive* is ``False`` (exclude), match memory blocks not allocated
377      in the address space :attr:`domain`.
378
379   .. attribute:: domain
380
381      Address space of a memory block (``int``). Read-only property.
382
383
384Filter
385^^^^^^
386
387.. class:: Filter(inclusive: bool, filename_pattern: str, lineno: int=None, all_frames: bool=False, domain: int=None)
388
389   Filter on traces of memory blocks.
390
391   See the :func:`fnmatch.fnmatch` function for the syntax of
392   *filename_pattern*. The ``'.pyc'`` file extension is
393   replaced with ``'.py'``.
394
395   Examples:
396
397   * ``Filter(True, subprocess.__file__)`` only includes traces of the
398     :mod:`subprocess` module
399   * ``Filter(False, tracemalloc.__file__)`` excludes traces of the
400     :mod:`tracemalloc` module
401   * ``Filter(False, "<unknown>")`` excludes empty tracebacks
402
403
404   .. versionchanged:: 3.5
405      The ``'.pyo'`` file extension is no longer replaced with ``'.py'``.
406
407   .. versionchanged:: 3.6
408      Added the :attr:`domain` attribute.
409
410
411   .. attribute:: domain
412
413      Address space of a memory block (``int`` or ``None``).
414
415   .. attribute:: inclusive
416
417      If *inclusive* is ``True`` (include), only match memory blocks allocated
418      in a file with a name matching :attr:`filename_pattern` at line number
419      :attr:`lineno`.
420
421      If *inclusive* is ``False`` (exclude), ignore memory blocks allocated in
422      a file with a name matching :attr:`filename_pattern` at line number
423      :attr:`lineno`.
424
425   .. attribute:: lineno
426
427      Line number (``int``) of the filter. If *lineno* is ``None``, the filter
428      matches any line number.
429
430   .. attribute:: filename_pattern
431
432      Filename pattern of the filter (``str``). Read-only property.
433
434   .. attribute:: all_frames
435
436      If *all_frames* is ``True``, all frames of the traceback are checked. If
437      *all_frames* is ``False``, only the most recent frame is checked.
438
439      This attribute has no effect if the traceback limit is ``1``.  See the
440      :func:`get_traceback_limit` function and :attr:`Snapshot.traceback_limit`
441      attribute.
442
443
444Frame
445^^^^^
446
447.. class:: Frame
448
449   Frame of a traceback.
450
451   The :class:`Traceback` class is a sequence of :class:`Frame` instances.
452
453   .. attribute:: filename
454
455      Filename (``str``).
456
457   .. attribute:: lineno
458
459      Line number (``int``).
460
461
462Snapshot
463^^^^^^^^
464
465.. class:: Snapshot
466
467   Snapshot of traces of memory blocks allocated by Python.
468
469   The :func:`take_snapshot` function creates a snapshot instance.
470
471   .. method:: compare_to(old_snapshot: Snapshot, key_type: str, cumulative: bool=False)
472
473      Compute the differences with an old snapshot. Get statistics as a sorted
474      list of :class:`StatisticDiff` instances grouped by *key_type*.
475
476      See the :meth:`Snapshot.statistics` method for *key_type* and *cumulative*
477      parameters.
478
479      The result is sorted from the biggest to the smallest by: absolute value
480      of :attr:`StatisticDiff.size_diff`, :attr:`StatisticDiff.size`, absolute
481      value of :attr:`StatisticDiff.count_diff`, :attr:`Statistic.count` and
482      then by :attr:`StatisticDiff.traceback`.
483
484
485   .. method:: dump(filename)
486
487      Write the snapshot into a file.
488
489      Use :meth:`load` to reload the snapshot.
490
491
492   .. method:: filter_traces(filters)
493
494      Create a new :class:`Snapshot` instance with a filtered :attr:`traces`
495      sequence, *filters* is a list of :class:`DomainFilter` and
496      :class:`Filter` instances.  If *filters* is an empty list, return a new
497      :class:`Snapshot` instance with a copy of the traces.
498
499      All inclusive filters are applied at once, a trace is ignored if no
500      inclusive filters match it. A trace is ignored if at least one exclusive
501      filter matches it.
502
503      .. versionchanged:: 3.6
504         :class:`DomainFilter` instances are now also accepted in *filters*.
505
506
507   .. classmethod:: load(filename)
508
509      Load a snapshot from a file.
510
511      See also :meth:`dump`.
512
513
514   .. method:: statistics(key_type: str, cumulative: bool=False)
515
516      Get statistics as a sorted list of :class:`Statistic` instances grouped
517      by *key_type*:
518
519      =====================  ========================
520      key_type               description
521      =====================  ========================
522      ``'filename'``         filename
523      ``'lineno'``           filename and line number
524      ``'traceback'``        traceback
525      =====================  ========================
526
527      If *cumulative* is ``True``, cumulate size and count of memory blocks of
528      all frames of the traceback of a trace, not only the most recent frame.
529      The cumulative mode can only be used with *key_type* equals to
530      ``'filename'`` and ``'lineno'``.
531
532      The result is sorted from the biggest to the smallest by:
533      :attr:`Statistic.size`, :attr:`Statistic.count` and then by
534      :attr:`Statistic.traceback`.
535
536
537   .. attribute:: traceback_limit
538
539      Maximum number of frames stored in the traceback of :attr:`traces`:
540      result of the :func:`get_traceback_limit` when the snapshot was taken.
541
542   .. attribute:: traces
543
544      Traces of all memory blocks allocated by Python: sequence of
545      :class:`Trace` instances.
546
547      The sequence has an undefined order. Use the :meth:`Snapshot.statistics`
548      method to get a sorted list of statistics.
549
550
551Statistic
552^^^^^^^^^
553
554.. class:: Statistic
555
556   Statistic on memory allocations.
557
558   :func:`Snapshot.statistics` returns a list of :class:`Statistic` instances.
559
560   See also the :class:`StatisticDiff` class.
561
562   .. attribute:: count
563
564      Number of memory blocks (``int``).
565
566   .. attribute:: size
567
568      Total size of memory blocks in bytes (``int``).
569
570   .. attribute:: traceback
571
572      Traceback where the memory block was allocated, :class:`Traceback`
573      instance.
574
575
576StatisticDiff
577^^^^^^^^^^^^^
578
579.. class:: StatisticDiff
580
581   Statistic difference on memory allocations between an old and a new
582   :class:`Snapshot` instance.
583
584   :func:`Snapshot.compare_to` returns a list of :class:`StatisticDiff`
585   instances. See also the :class:`Statistic` class.
586
587   .. attribute:: count
588
589      Number of memory blocks in the new snapshot (``int``): ``0`` if
590      the memory blocks have been released in the new snapshot.
591
592   .. attribute:: count_diff
593
594      Difference of number of memory blocks between the old and the new
595      snapshots (``int``): ``0`` if the memory blocks have been allocated in
596      the new snapshot.
597
598   .. attribute:: size
599
600      Total size of memory blocks in bytes in the new snapshot (``int``):
601      ``0`` if the memory blocks have been released in the new snapshot.
602
603   .. attribute:: size_diff
604
605      Difference of total size of memory blocks in bytes between the old and
606      the new snapshots (``int``): ``0`` if the memory blocks have been
607      allocated in the new snapshot.
608
609   .. attribute:: traceback
610
611      Traceback where the memory blocks were allocated, :class:`Traceback`
612      instance.
613
614
615Trace
616^^^^^
617
618.. class:: Trace
619
620   Trace of a memory block.
621
622   The :attr:`Snapshot.traces` attribute is a sequence of :class:`Trace`
623   instances.
624
625   .. attribute:: size
626
627      Size of the memory block in bytes (``int``).
628
629   .. attribute:: traceback
630
631      Traceback where the memory block was allocated, :class:`Traceback`
632      instance.
633
634
635Traceback
636^^^^^^^^^
637
638.. class:: Traceback
639
640   Sequence of :class:`Frame` instances sorted from the most recent frame to
641   the oldest frame.
642
643   A traceback contains at least ``1`` frame. If the ``tracemalloc`` module
644   failed to get a frame, the filename ``"<unknown>"`` at line number ``0`` is
645   used.
646
647   When a snapshot is taken, tracebacks of traces are limited to
648   :func:`get_traceback_limit` frames. See the :func:`take_snapshot` function.
649
650   The :attr:`Trace.traceback` attribute is an instance of :class:`Traceback`
651   instance.
652
653   .. method:: format(limit=None)
654
655      Format the traceback as a list of lines with newlines.  Use the
656      :mod:`linecache` module to retrieve lines from the source code.  If
657      *limit* is set, only format the *limit* most recent frames.
658
659      Similar to the :func:`traceback.format_tb` function, except that
660      :meth:`.format` does not include newlines.
661
662      Example::
663
664          print("Traceback (most recent call first):")
665          for line in traceback:
666              print(line)
667
668      Output::
669
670          Traceback (most recent call first):
671            File "test.py", line 9
672              obj = Object()
673            File "test.py", line 12
674              tb = tracemalloc.get_object_traceback(f())
675