от http://code.google.com/p/fast-serialization/wiki/QuickStartHeapOff
Что такое разгрузка кучи?
Обычно все не временные объекты, которые вы размещаете, управляются сборщиком мусора Java. Хотя виртуальная машина выполняет достойную работу по сбору мусора, в определенный момент она должна выполнить так называемый «полный сборщик мусора». Полный GC включает в себя сканирование всей выделенной кучи, что означает, что паузы / замедления GC пропорциональны размеру кучи приложения. Поэтому не верьте никому, кто говорит вам: «Память дешева». В Java потребление памяти вредит производительности. Кроме того, вы можете получить заметные паузы, используя размеры кучи> 1 Гб. Это может быть неприятно, если у вас есть какие-то вещи, происходящие почти в реальном времени, в кластере или сетке процесс Java может перестать отвечать и выпадать из кластера.
Однако современные серверные приложения (часто построенные на раздуваемых фреймворках ;-)) легко требуют кучи, намного превышающие 4 ГБ.
Одним из решений этих требований к памяти является «разгрузка» частей объектов в кучу, отличную от Java (непосредственно выделяемую из ОС). К счастью, java.nio предоставляет классы для прямого выделения / чтения и записи «неуправляемых» фрагментов памяти (даже файлов, отображаемых в память).
Таким образом, можно выделить большие объемы «неуправляемой» памяти и использовать ее для сохранения там объектов. Для сохранения произвольных объектов в неуправляемую память наиболее жизнеспособным решением является использование сериализации. Это означает, что приложение сериализует объекты в оперативную память, позже объект может быть прочитан с использованием десериализации.
Размер кучи, управляемой Java-ВМ, может быть небольшим, поэтому GC-паузы в миллисах, все довольны, работа выполнена.
Понятно, что производительность такого буфера вне кучи зависит в основном от производительности реализации сериализации. Хорошая новость: по какой-то причине FST-сериализация довольно быстрая: -).
Примеры сценариев использования:
- Кэш сессий в серверном приложении. Используйте отображенный в памяти файл для хранения гигабайт (неактивных) пользовательских сеансов. Как только пользователь войдет в ваше приложение, вы сможете быстро получить доступ к пользовательским данным, не имея дело с базой данных.
- Кэширование результатов вычислений (запросов, html-страниц, ..) (применимо, только если вычисления выполняются медленнее, чем десериализация объекта результата c).
- очень простое и быстрое сохранение с использованием отображенных в память файлов
Редактировать: для некоторых сценариев можно выбрать более сложные алгоритмы сбора мусора, такие как ConcurrentMarkAndSweep или G1, для поддержки больших куч (но это также имеет свои пределы, превышающие кучу в 16 ГБ). Также имеется коммерческая JVM с улучшенным GC (Azul) без пауз.