Phase 9 of 25 · Topic 9.3

Detecting Memory Leaks with tracemalloc & gc Module

1Concept

Memory leaks in Python typically occur when objects remain referenced in global caches, long-lived lists, or circular closures. `tracemalloc` tracks memory allocation traces, and `gc.get_referrers()` inspects which objects are keeping a leaked object alive in memory.

2Architecture Diagram

[ Leaked Object ] <--- Referenced by [ Global Dictionary Cache ] ---> GC Root Prevents Collection!

3Code Example

Python 3.12
import gc

class LeakCandidate:
    pass

global_cache = []

def simulate_request():
    obj = LeakCandidate()
    global_cache.append(obj) # Leaked into global collection

simulate_request()
candidate = global_cache[0]
referrers = gc.get_referrers(candidate)
print(f"Number of referrers holding candidate in memory: {len(referrers)}")
print(f"Is global_cache the referrer: {global_cache in referrers}")

4Expected Output

Number of referrers holding candidate in memory: 1
Is global_cache the referrer: True

5Key Takeaways

  • `gc.get_referrers(obj)` returns all objects referencing `obj`, pinpointing leak roots.
  • `tracemalloc.compare_to()` compares snapshots to detect growing memory lines.
  • Clear global state or use WeakValueDictionary to prevent cache leaks.