I had similar experience of finding memory leak in Python. It's a 64 G server, but we load everything from database to memory. I didn't success. This experience made me question myself: is it wrong to create a lot of objects in memory and let them reference each other, and hope Garbage Collector to magically work? If instead of object, we just put data into memory more organized as a (column) database, then we don't…
It's called "data-oriented design". Look into the gaming industry, where there's a lot of anti-OOP sentiment. They're primarily coming at it from the standpoint of optimizing memory access for cache lines, but there are side benefits that come from it around reducing memory allocation and usage, and avoiding the cost of abstractions that come with hidden inefficiencies.