The largest problem is the policy that unused memory is wasted memory. The Linux VM system will hang onto any data that has any chance of being useful for as long as that memory isn't needed for anything else. This is obviously true for physical machines, since their memory can't be used in any other way, but false for virtual ones, since their memory can possibly be put to better use by the host and by other virtual machines.
There is a partial solution in allowing UMLs to be swapped by the host. This isn't very good because it doesn't take into account the knowledge that the UMLs have about their own memory and what they don't really need any more.
So, what is needed here is a mechanism for communicating memory pressure from the host to the UMLs and for the UMLs to respond by releasing memory back to the host.