Сначала немного терминологии.В некоторых областях, например, связанных с Linux разговорах, paging является функцией операционной системы, в которой исполняемый код не обязательно должен постоянно находиться в оперативной памяти.Исполняемый код происходит из исполняемого файла, и ядро загружает его с диска по требованию, когда процессор выполняет инструкции в программе.Когда памяти недостаточно, ядро может решить просто «забыть» страницу кода, поскольку оно знает, что всегда может перезагрузить ее из исполняемого файла, если этот код необходимо выполнить снова.
Ядротакже реализует еще одну функцию, которая называется swapping и примерно такая же, но для данных.Данные не получены из исполняемого файла.Следовательно, ядро не может просто забыть страницу данных;он должен сохранить его где-то, в специальной области, называемой «файл подкачки» или «раздел подкачки».Это делает подкачку более дорогой, чем подкачка: ядро должно записать страницу данных перед повторным использованием соответствующей оперативной памяти, тогда как кодовая страница может просто повторно использоваться напрямую.На практике страницы ядра довольно много перед тем, как рассмотреть возможность обмена.
Пейджинг , таким образом, ортогонален сборке мусора. Обмен , однако, не является.Общее эмпирическое правило заключается в том, что обмен и сборщик мусора плохо сочетаются.Большинство GC работают, регулярно проверяя данные, и если указанные данные были отправлены в раздел подкачки, то их придется перезагружать из этого раздела, что означает, что некоторые другие данные должны быть отправлены в указанный раздел, потому что еслиданные были в разделе подкачки, а не в оперативной памяти, то это означает, что память ограничена.При наличии подкачки сборщик мусора имеет тенденцию вызывать значительную активность на диске.
Некоторые сборщики мусора применяют сложные стратегии для уменьшения стратегий, связанных с обменом.Это включает в себя GC поколения (который пытается исследовать старые данные реже) и строгую типизацию (GC смотрит на данные, потому что ему нужно найти указатели ; если он знает, что большой кусок оперативной памяти содержит только не указателиНапример, это некоторые данные изображения только с пиксельными значениями, тогда он может оставить их в покое, и, в частности, , а не принудительно возвращает их из области подкачки).Известно, что GC в виртуальной машине Java (от Sun / Oracle) достаточно хорош.Но это только относительно: если ваше Java-приложение ударит по swap, вы будете ужасно страдать.Но это могло бы быть намного хуже .
Просто купите немного дополнительной оперативной памяти.