Разница между "кучей" и "кучей" - PullRequest
123 голосов
/ 23 мая 2011

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

Ответы [ 6 ]

146 голосов
/ 23 мая 2011

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

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

82 голосов
/ 15 декабря 2012

от 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) без пауз.

32 голосов
/ 23 мая 2011

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

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

14 голосов
/ 23 июля 2017

На коротком изображении

Java On/Off Heap storage in short

фото кредитов


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

Java On/Off Heap storage in details

фото кредитов

1 голос
/ 23 мая 2011

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

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

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

1 голос
/ 23 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...