1 回答

TA貢獻1856條經(jīng)驗 獲得超5個贊
在 Oracle/OpenJDK 中,ByteBuffer.allocateDirect(n)
使用Unsafe.allocateMemory(n)在 Linux 上調(diào)用malloc。
在 Linux 上,malloc 從內(nèi)存池中分配較小的分配,例如 8KB,但是,對于 128 KB 或更多的分配,它會添加一個新的mmap
.
我實際上期望一些 mmap 或 sys_brk 系統(tǒng)調(diào)用直接從操作系統(tǒng)分配內(nèi)存
嘗試一次分配128 << 10
或 128 KB。
這似乎是分配直接緩沖區(qū)比分配堆緩沖區(qū)慢的原因,因為每次分配都需要系統(tǒng)調(diào)用。
系統(tǒng)調(diào)用增加了大約 2 微秒。不打算經(jīng)常分配和釋放直接的 ByteBuffer。您應(yīng)該找到重用這些緩沖區(qū)的方法。
如果我錯了,請糾正我,但堆緩沖區(qū)分配(如果發(fā)生在 TLAB 內(nèi))相當于返回一個指向預分配堆內(nèi)存的指針。
正確的。本機內(nèi)存中較小的分配使用本機堆。
問題:為什么我們不能對直接內(nèi)存做同樣的事情?
確實如此。
返回一個指向預分配內(nèi)存的指針?
它不會為 128 KB+ 執(zhí)行此操作以將內(nèi)存釋放回操作系統(tǒng)。
添加回答
舉報