Скажу больше, при включенной динамической памяти виртуалки будут почти всегда работать с 80% загрузкой ОЗУ или близкой к ней. Если виртуалке понадобится больше - ей выдадут. А если нет, то зачем держать выделенной свободную память?
С контейнерами бывает еще веселее, когда внутри контейнер считает, что у него занято пару гигов памяти, а гипервизор говорит, что там только 500 МБ выделено. Потому что в этом и смысл контейнера - максимально использовать общие ресурсы, например, то же ядро и стандартные библиотеки.