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.