Я пытаюсь понять, как DirectByteBuffer
работает в Linux, и написал следующую очень простую программу для работы в режиме strace:
public static void main(String[] args){
while(true){
ByteBuffer buffer = ByteBuffer.allocateDirect(8192);
}
}
Я ожидал, что на самом деле некоторые mmap
или sys_brk
системные вызовывыделять память из операционной системы напрямую, но на самом деле она просто устанавливает защиту от чтения и записи запрошенных страниц.Я имею в виду что-то вроде:
mprotect(0x7fa9681ef000, 8192, PROT_READ|PROT_WRITE) = 0
Кажется, причина в том, что выделение прямого буфера медленнее, чем выделение буфера кучи, поскольку для каждого выделения требуется системный вызов.
Пожалуйста, исправьте меня, если я ошибаюсь, но выделение буфера кучи (если происходит внутри TLAB) эквивалентно возвращению указателя на предварительно выделенную память кучи.
ВОПРОС: Почему мы не можем сделать то же самое для прямой памяти?Вернуть указатель на заранее выделенную память?