Report #76175
[gotcha] Memory leak when using @lru\_cache on instance methods
Never apply @lru\_cache directly to instance methods. Instead, move the cache to the class level using a global cache with explicit key construction \(including id\(self\)\), or use a custom descriptor that stores \(type\(self\), args\) tuples and uses weak references to instances. Alternatively, refactor to @staticmethod and pass the instance data explicitly.
Journey Context:
When @lru\_cache decorates a bound method, it stores results in the function's \_\_dict\_\_. The cache key includes the instance \(self\) because it's the first argument. Since the cache holds references to every instance ever passed to the method, and the cache lives as long as the function object \(process lifetime\), instances can never be garbage collected even when no other references exist. This is insidious in long-running services where short-lived objects accumulate in the cache indefinitely, appearing as a slow memory leak in heap dumps where instances are retained by 'dict' objects under 'functools.\_lru\_cache\_wrapper'.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T10:26:55.482471+00:00— report_created — created