Сколько данных слишком много для кэша Java в куче? Когда я должен начать думать о кеше вне кучи?

Сколько данных слишком много для кэша в куче, такого как ehcache?

Я получаю 24 ГБ ОЗУ сервера. Я, вероятно, начну с того, что выделю 2-4 ГБ для кеширования, но, возможно, в конечном итоге выделим 20 ГБ или около того для кэширования. В какой момент я должен беспокоиться о том, что GC для кэша в куче займет слишком много времени?

Кстати, является ли DirectMemory единственным доступным кэшем вне кучи с открытым исходным кодом? Это готово к прайм-тайм?

3 ответа

Решение

Зависит от вашей JVM и особенно от используемого GC. Более старые GC особенно не были способны обрабатывать действительно большие кучи, но предпринимались все большие усилия, чтобы это исправить.

Например, системы Azul продают оборудование с сотнями ГБ кучи без проблем (то есть gc делает паузы в мс, а не полминуты) благодаря своему специальному GC, так что это не ограничение Java как таковое. Понятия не имею, насколько хорошая точка доступа /IBM достигла со временем все же. Но тогда куча в 24 ГБ не так уж и велика - G1, вероятно, должен был бы там все равно работать достаточно хорошо.

Основная проблема с большим кешем - полное время GC. Чтобы дать вам представление, это может быть 1 секунда на ГБ (это зависит от приложения к приложению). Если у вас кэш-память объемом 20 ГБ, а приложение периодически останавливается на 20 секунд, это приемлемо?

Как поклонник файлов с прямым отображением и памятью, я склонен думать о том, когда бы я не выкладывал данные из кучи, а просто использовал их для простоты.;) Файлы с отображением в памяти практически не влияют на полное время GC независимо от размера.

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

Кстати: наличие более быстрого SSD также помогает;) Большие диски также имеют тенденцию работать быстрее. Проверьте IOP, которые они могут выполнить.

В этом примере я создаю файловую память объемом 8 ТБ, сопоставленную на машине с 16 ГБ. http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html

Обратите внимание, что в примере с файлом размером 80 ГБ он работает лучше, 8 ТБ, скорее всего, будет слишком большим.;)

В какой момент я должен беспокоиться о том, что GC для кэша в куче займет слишком много времени?

Как долго это слишком долго?

Серьезно, если вы используете сборщик мусора с "пропускной способностью" и это дает вам слишком длинные паузы, то вам следует попробовать переключиться на сборщик с низкой паузой; например, CMS или G1.

Другие вопросы по тегам