Direct ByteBuffers (те, которые выделены с помощью ByteBuffer.allocateDirect) отличаются от MappedByteBuffers тем, что они представляют разные секции памяти и распределяются по-разному. Direct ByteBuffers - это способ доступа к блоку памяти, выделенному вне JVM, обычно выделяемому с помощью вызова malloc (хотя в большинстве реализаций, вероятно, будет использоваться эффективный распределитель slab). То есть это просто указатель на блок памяти.
MappedByteBuffer представляет раздел памяти, выделенный с помощью вызова mmap , который используется для выполнения ввода-вывода с отображением в памяти. Поэтому MappedByteBuffers не будет регистрировать свое использование памяти так же, как Direct ByteBuffer.
Так что, хотя оба являются «прямыми» в том смысле, что они представляют память вне JVM, их цели различны.
Кроме того, чтобы получить значение reservedMemory, вы рефлексивно вызываете внутренний метод JVM, реализация которого не охватывается какой-либо спецификацией, поэтому нет никаких гарантий относительно того, что это значение возвращает. Прямой ByteBuffers может быть выделен изнутри JNI с использованием NewDirectByteBuffer вызова из C / C ++ (MappedByteBuffers, вероятно, использует это), и это, вероятно, не влияет на значение reservedMemory, которое может быть изменено только при использовании Java ByteBuffer.allocateDirect .