Разница между "в куче" и " вне кучи"



Ehcache переговоры о в куче и вне кучи памяти. В чем же разница? Что для JVM аргументы используются, чтобы настроить их?

550   6  

6 ответов:

хранилище в куче ссылается на объекты, которые будут присутствовать в куче Java (а также подлежат GC). С другой стороны, хранилище вне кучи относится к (сериализованным) объектам, которые управляются EHCache, но хранятся вне кучи (а также не подлежат GC). Поскольку хранилище вне кучи продолжает управляться в памяти, оно немного медленнее, чем хранилище в куче, но все же быстрее, чем хранилище на диске.

внутренние детали, участвующие в управлении и использовании вне кучи магазин не очень заметен в ссылке, опубликованной в вопросе, поэтому было бы разумно проверить детали Terracotta BigMemory, который используется для управления дисковым хранилищем. BigMemory (хранилище вне кучи) должно использоваться, чтобы избежать накладных расходов GC в куче, которая составляет несколько мегабайт или гигабайт. BigMemory использует адресное пространство памяти процесса JVM, через прямые ByteBuffers которые не подлежат GC в отличие от других собственных объектов Java.

от http://code.google.com/p/fast-serialization/wiki/QuickStartHeapOff

Что такое разгрузка кучи ?

обычно все нестационарные объекты, которые вы выделяете, управляются сборщиком мусора java. Хотя виртуальная машина делает достойную работу по сбору мусора, в определенный момент виртуальная машина должна сделать так называемый "полный GC". Полный GC включает сканирование всей выделенной кучи, что означает, что паузы/замедления GC пропорциональны размер кучи приложений. Поэтому не доверяйте никому, кто говорит вам: "память дешева". В java потребление памяти вредит производительности. Кроме того, вы можете получить заметные паузы, используя размеры кучи > 1 Гб. Это может быть неприятно, если у вас есть какие-либо вещи в режиме реального времени, в кластере или сетке процесс java может перестать отвечать и быть удален из кластера.

однако сегодняшние серверные приложения (часто построенные поверх раздутых фреймворков ; -)) легко требуют кучи далеко за пределами 4гб.

одним из решений этих требований к памяти является "разгрузка" частей объектов в кучу не java (непосредственно выделенную из ОС). К счастью, Ява.nio предоставляет классы для непосредственного выделения / чтения и записи "неуправляемых" фрагментов памяти (даже файлов с отображением памяти).

таким образом, можно выделить большие объемы "неуправляемой" памяти и использовать это для сохранения объектов там. Чтобы сохранить произвольные объекты в неуправляемой памяти, наиболее жизнеспособным решением является использование Сериализация. Это означает, что приложение сериализует объекты в память offheap, позже объект может быть прочитан с помощью десериализации.

размер кучи, управляемый Java VM, может быть небольшим, поэтому паузы GC находятся в миллисе, все довольны, работа выполнена.

понятно, что производительность такого буфера вне кучи зависит в основном от производительности реализации сериализации. Хорошая новость: по какой-то причине FST-сериализация происходит довольно быстро :-).

пример использования:

  • кэш сеанса в серверном приложении. Используйте сопоставленный файл памяти для хранения гигабайт (неактивных) пользовательских сеансов. После входа пользователя в приложение можно быстро получить доступ к данным, связанным с пользователем, без необходимости работать с базой данных.
  • кэширование результатов вычислений (запросы, html страницы, ..) (применимо только в том случае, если вычисление выполняется медленнее, чем десериализация результирующего объекта ofc).
  • очень простое и быстрое сохранение с помощью файлов с отображением памяти

Edit: для некоторых сценариев можно выбрать более сложные алгоритмы сбора мусора, такие как ConcurrentMarkAndSweep или G1 для поддержки больших куч (но это также имеет свои пределы за пределами 16 ГБ кучи). Существует также коммерческая JVM с улучшенным "беспаузным" GC (Azul).

куча-это место в памяти, где живут ваши динамически выделенные объекты. Если вы использовали new тогда это в куче. Это в отличие от пространства стека, в котором живет стек функций. Если у вас есть локальная переменная, то эта ссылка находится в стеке. Куча Java подлежит сборке мусора, и объекты можно использовать напрямую.

хранилище вне кучи EHCache удаляет ваш обычный объект из кучи, сериализует его и сохраняет его в виде байтов в куске памяти это EHCache удается. Это похоже на хранение его на диске, но он все еще находится в оперативной памяти. Объекты не могут непосредственно использоваться в этом состоянии, они должны быть десериализованы в первую очередь. Также не подлежит сбору мусора.

короче картинка

Java On/Off Heap storage in short

pic кредиты


детальное изображение

Java On/Off Heap storage in details

pic кредиты

JVM ничего не знает о памяти вне кучи. Ehcache реализует кэш на диске, а также кэш в памяти.

не 100%; однако, похоже, что куча-это объект или набор выделенного пространства (на ОЗУ), который встроен в функциональность кода либо самой Java, либо более вероятной функциональности от самого ehcache, а вне кучи ОЗУ также есть собственная система; однако, похоже, что это на одну величину медленнее, поскольку он не так организован, то есть он не может использовать кучу (что означает один длинный набор пространства ОЗУ), а вместо этого использует разные адресные пространства, вероятно, делая его немного меньше эффективный.

тогда, конечно, следующий уровень ниже-это само пространство на жестком диске.

Я не использую ehcache, поэтому вы можете не доверять мне, но это то, что я собрал из их документации.

Comments

    Ничего не найдено.