in reply to How to return unused memory to OS?

Are you anyhwere setting any variables to undef or taking it out of scope?
As you pointed out this is reference counting, thus there needs to be no reference so that it can be garbaged collected.
Unfortunately Perl is not as smart as for instance the CLR for .NET to find cyclic references.
One solution could be to refactor your code to work with more functions with local variables.