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.

In reply to Re: How to return unused memory to OS? by weismat
in thread How to return unused memory to OS? by mihirjha

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":