directByteBuffer 到底是属于用户空间还是内核空间?
1
hsiafan Feb 15, 2019
ByteBuffer.allocateDirect 是使用 mmap 分配的,都是在用户空间的内存
|
2
mortonnex OP @xiaxiaocao 所以用 directBuffer 的效率并不会比 heapBuffer 高? 优点就只剩下不被 gc 回收吗
|
3
hsiafan Feb 15, 2019
当然比 heap Buffer 高啊,而且 Java 的实现 direct buffer 也是在 GC 的时候回收的,这里讲的 heap 和堆都是指 JVM GC 管理的那部分内存。
性能高比 heap buffer 高是因为 heap buffer 在做 IO 的时候有 heap buffer 和非堆内存之间的拷贝,读的时候是内核内存 -> 非堆内存 -> 堆内内存,写的时候是堆内内存 -> 非堆内存 -> 内核内存。direct buffer 省了这部分的拷贝,但是用户内存和内核空间内存的拷贝还是在的。 为啥 heap buffer 要拷贝一次,是以为现在 JVM 的实现,IO 的时候如果发生 GC 的话,没有机制保证 buffer 的地址不变,所以只能先拷贝到非 gc 堆管理的地方,再做 IO |
4
mortonnex OP #3
谢谢回复! 1. "Java 的实现 direct buffer 也是在 GC 的时候回收" 这个有依据吗 2. 如果是通过 JNA 操作的 direct 内存, 是不会被 java 的 GC 管理的对吧 |
5
mortonnex OP @xiaxiaocao 刚刚忘记 at 了...
|