Смысл BigMemory не в том, что собственная память работает быстрее, а в том, чтобы уменьшить нагрузку на сборщик мусора, который требует усилий для отслеживания ссылок на память и ее очистки.По мере увеличения размера кучи увеличиваются интервалы между сборками GC и загрузка процессора.В зависимости от ситуации это может создать своего рода «стеклянный потолок», когда куча Java становится настолько большой, что GC превращается в боров, потребляя огромное количество процессорной мощности каждый раз, когда GC включается. Кроме того, многие алгоритмы GC требуютнекоторый уровень блокировки, который означает, что никто ничего не может сделать, пока не завершится эта часть алгоритма отслеживания ссылок GC, хотя многие JVM стали намного лучше справляться с этим.Там, где я работаю, с нашим сервером приложений и JVM, мы обнаружили, что «стеклянный потолок» составляет около 1,5 ГБ.Если мы попытаемся сконфигурировать кучу больше этой, процедура GC начнет израсходовать более 50% общего процессорного времени, так что это очень реальные затраты.Мы определили это с помощью различных форм анализа GC, предоставляемых нашим поставщиком JVM.
BigMemory, с другой стороны, использует более ручной подход к управлению памятью.Это уменьшает накладные расходы и отчасти возвращает нас к необходимости выполнять собственную очистку памяти, как мы это делали в C, хотя и в гораздо более простом подходе, похожем на HashMap.Это существенно устраняет необходимость в традиционной процедуре сборки мусора, и в результате мы устраняем эти издержки.Я считаю, что ребята из Terracotta использовали встроенную память через ByteBuffer, так как это простой способ выбраться из-под Java-сборщика мусора.
В следующем техническом документе есть некоторая хорошая информация о том, как они спроектировали BigMemory, и некоторые сведения онакладные расходы ГК: http://www.terracotta.org/resources/whitepapers/bigmemory-whitepaper.