Я взял красивое описание похожее вблизи к ситуации, потому что что-то запустил ёмкое поработал - выключил и кэш данных особо не изменился после закрытия, и свободной ОП памяти всё также 100-400 мб , то есть получается приложение не закрылось полностью как хотелось бы.
Приложение закрылось, выделенная ему память освободилась (пометилась как свободная). А файловый кэш - он общий для всей ОС. Одни и те же файлы могут использоваться разными приложениями от имени разных пользователей. Именно ОС определяет политику использования памяти под файловый кэш.
То, что у вас файловый кэш резко уменьшился после sync, говорит о том, что вероятно приложение много писало в файлы, и после sync буфера скинулись на диск и освободили память.
По мере надобности памяти (запустилось ещё приложение и запросило для себя память) файловый кэш может уменьшиться, освободив например память, которая уже давно не использовалась, например, выделенную для кэширования файлов уже давно закрытого приложения.
Если свободной памяти в системе много, то файловый кэш может сохраняться весьма долго.
Например, я замечал, что у меня первый запуск виртуальной машины KVM (libvirt) происходит с обычной скоростью, но после её останова и спустя несколько часов несложной возни (редактирование текстов, браузер), когда снова запускаешь эту же виртуалку, то её старт происходит гораздо шустрее. И как-то совершенно не замечалось, что файловый кэш не очищался полностью.
Вот эксперимент.
Конфигурация компа Starterkit KDE, оперативки 8Гб, HDD 7200об/мин, для виртуалки (вин7) выделено 2Гб оперативки, диск - 35Гб.
Сессия КДЕ не запущена, удаленный доступ через тоннель ssh к виртуалкам (libvirt это легко и красиво позволяет)
В состоянии до запуска виртуалки
$ free -h
total used free shared buff/cache available
Mem: 7,6Gi 386Mi 2,6Gi 318Mi 4,7Gi 6,7Gi
Swap: 8,0Gi 12Mi 8,0Gi
Доступно - 6.7Гб, т.е. система резервирует под кэш 0.6Гб, остальное готова отдать приложениям.
Теперь запускаем виртуалку:
$ free -h
total used free shared buff/cache available
Mem: 7,6Gi 2,5Gi 596Mi 318Mi 4,6Gi 4,6Gi
Swap: 8,0Gi 12Mi 8,0Gi
Виртуалка сожрала чуть больше 2.1Гб памяти, файловый кэш уменьшился на 100 метров, в своп ничего не ушло.
Запускаем ещё одну виртуалку с такими же параметрами как у первой:
$ free -h
total used free shared buff/cache available
Mem: 7,6Gi 4,5Gi 124Mi 314Mi 3,0Gi 2,6Gi
Swap: 8,0Gi 13Mi 8,0Gi
Память для ещё одной виртуалки выделилась за счет уменьшения файлового кэша, своп увеличился буквально на 1 мегабайт.
Тушим обе виртуалки:
$ free -h
total used free shared buff/cache available
Mem: 7,6Gi 377Mi 4,3Gi 313Mi 3,0Gi 6,7Gi
Swap: 8,0Gi 12Mi 8,0Gi
Просто освободилась память, кэш остался пока на прежнем уровне.
Теперь запускаем тестирование архива 7z размером 36Гб (как раз оказался под рукой :) ), чтобы поднапрячь файловый кэш. Сразу после тестирования:
$ free -h
total used free shared buff/cache available
Mem: 7,6Gi 352Mi 140Mi 313Mi 7,2Gi 6,7Gi
Swap: 8,0Gi 12Mi 8,0Gi
Как видим, забрал под кэш по максимуму. После sync картина не поменялясь, впрочем и понятно, кэш использовался в основном на чтение.
Опять запускаем одну виртуалку, кстати, запуск происходит весьма быстро, т.е. что-то в кэше возможно оставалось:
$ free -h
total used free shared buff/cache available
Mem: 7,6Gi 2,5Gi 125Mi 313Mi 5,1Gi 4,6Gi
Swap: 8,0Gi 12Mi 8,0Gi
И останавливаем виртуалку:
$ free -h
total used free shared buff/cache available
Mem: 7,6Gi 373Mi 2,2Gi 312Mi 5,0Gi 6,7Gi
Swap: 8,0Gi 12Mi 8,0Gi
Таким образом видим, что работа с памятью в линукс очень даже неплохо организована по умолчанию без каких-либо дополнительных тонких настроек.