GC frees only objects that are unreachable. If you keep references by mistake (e.g., a static list/map that grows, caches without eviction, listeners not removed), objects stay reachable and memory usage grows.