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

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


person Synesso    schedule 22.05.2011    source источник
comment
Чтобы узнать, как использовать память вне кучи, см. stackoverflow.com/a/30027374/895245   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 04.05.2015
comment
Ссылка в вопросе не работает. Ссылка на новую последнюю версию: ehcache.org/documentation/3.8/tiering.html # off-heap   -  person Shubham    schedule 10.06.2021


Ответы (6)


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

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

person Vineet Reynolds    schedule 23.05.2011
comment
Прямые ByteBuffers предлагают доступ к неуправляемой памяти, но сами подчиняются GC (в отличие от данных, на которые они указывают). Это важно, потому что прямой ByteBuffer (тип ByteBuffer.allocateDirect, а не тип MMap) будет собираться GC, и когда он будет собран, Deallocater сработает, эффективно собирая также неуправляемую память. - person Nitsan Wakart; 23.02.2015
comment
Использование Unsafe для выделения объектов, похоже, значительно улучшает производительность чтения и записи по сравнению с Onheap / DirectByteBuffers / ByteBuffers. ashkrit.blogspot.com/2013/07/ - person Joe C; 24.05.2015

из http://code.google.com/p/fast-serialization/wiki/QuickStartHeapOff

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

Обычно все выделяемые вами невременные объекты управляются сборщиком мусора java. Хотя виртуальная машина неплохо справляется со сборкой мусора, в определенный момент виртуальная машина должна выполнить так называемую «полную сборку мусора». Полный сборщик мусора включает сканирование всей выделенной кучи, что означает, что паузы / замедления сборки мусора пропорциональны размеру кучи приложения. Так что не верьте никому, кто говорит вам: «Память - дешевая». Использование памяти Java снижает производительность. Кроме того, вы можете получить заметные паузы при размерах кучи> 1 Гб. Это может быть неприятно, если у вас есть какие-либо вещи, близкие к реальному времени, в кластере или сетке Java-процесс может перестать отвечать и быть удален из кластера.

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

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

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

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

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

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

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

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

person R.Moeller    schedule 15.12.2012
comment
выделять большие объемы «неуправляемой» памяти и использовать ее для сохранения там объектов - вы не можете сохранять объекты в оперативном режиме. Вы можете хранить примитивы, вы можете обернуть их в любую библиотеку, которая вам нравится, но это не объекты. Данные, которые вы размещаете вне кучи, не имеют заголовка объекта, вы не можете синхронизировать его, вы не можете ссылаться на него со ссылочным полем в каком-либо другом объекте. - person Nitsan Wakart; 23.02.2015

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

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

person Adam    schedule 23.05.2011
comment
Разве это не просто все еще в куче, а в сериализованной форме? - person Pacerier; 12.02.2012
comment
как это делает его более эффективным? - person Pacerier; 14.02.2012
comment
Есть много способов. Поскольку объекты больше не находятся в основной куче Java, они не тратят время сборщика мусора, не фрагментируют кучу JVM и освобождают пространство для других, более используемых объектов. Кроме того, поскольку они сериализованы и, вероятно, не понадобятся в ближайшем будущем, их можно сжимать, перемещать по мере необходимости или даже выгружать на диск. - person Adam; 17.02.2012
comment
В Hotspot время паузы GC напрямую зависит от размера кучи. BigMemory обеспечивает этот компромисс, используя RAM вместо кучи, чтобы свести к минимуму паузу GC и избежать затрат ввода-вывода при доступе к диску. - person Chander Shivdasani; 02.04.2012
comment
@Adam Спасибо за ответ, когда вы говорите, что хранит его в байтах, что именно это означает? На самом деле я поднимаю вопрос в stackoverflow.com/questions/63320051/, но ответа нет, есть ли у вас подсказки? Спасибо. - person jack; 09.08.2020

Вкратце картина

Вкратце

в картинках


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

Подробная информация о хранилище в куче Java On / Off

в картинках

person mrsrinivas    schedule 23.07.2017
comment
Контролируется ли память кучи с помощью -xmx? Синий - Old Gen или офф-куча? - person Himanshu Ahire; 30.08.2018
comment
Нет. Это неиспользуемое пространство в куче, оно будет заполнено, когда в куче будет создано много объектов. - person mrsrinivas; 31.08.2018

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

person gatkin    schedule 23.05.2011

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

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

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

person msj121    schedule 23.05.2011