Обычные менеджеры памяти (окромя самых древних) в ОС делают дефрагментацию памяти, так что сам сборщик мусора, работающий поверх него, может и не знать ни о какой дефрагментации -- просто выделяет и когда соизволит -- освободит память.
Насколько я знаю, стандартные менеджеры памяти совсем не реал-таймные, пример -- дикие свопинги в винде или линупсе...
Не, это Вы зря... Менеджеры памяти и в WinNT/XP/7/серверных вариантах, и в Linux (на уровне ядра) сделаны очень грамотно. Да, и современные процессоры эффективно поддерживают работу с памятью. На физическом уровне вся память разделена на страницы. Никакого сжатия страниц нет. Освободившиеся страницы возвращаются ОС, где очищаются и, если необходимо, то передаются другому процессу, вставляясь в нужное место виртуальной памяти данного процесса. В случае, если физической памяти недостаточно, происходит запись "ненужной" страницы на внешний носитель, после этого страница помечается, как свободная, очищается и передаётся процессу, который запрашивает память. При обращении к выгруженной странице, происходит её загрузка с внешнего носителя на свободную страницу физической памяти и подстановка по заданному адресу. При этом может возникнуть ситуация, когда нет доступных страниц. Поэтому сначала выгружается другая "ненужная" страница, а на её место загружается "нужная". Отсюда и свопинг. Чем меньше физической памяти и чем интенсивнее выдаются запросы на выделение памяти, тем чаще страницы сбрасываются на внешний носитель и загружаются с него. Но другого, сравнимого по эффективности, алгоритма работы/устройства менеджера памяти нет.