I don't know if i have a solution to your problem, but i am too having the problem and i came across a link which had the answer to my question. In linux there are shared and cached memory, so the memory which is not getting free is allocated here. Please vivit the following link for a more detailed answer...
But, i am looking as to how can we free the shared and cached memory and will this have an adverse effect on the total performace. If you come across the answer to this question then pls do let me know.