1
xiaxiaocao 2019-02-15 11:00:32 +08:00
ByteBuffer.allocateDirect 是使用 mmap 分配的,都是在用户空间的内存
|
2
mortonnex OP @xiaxiaocao 所以用 directBuffer 的效率并不会比 heapBuffer 高? 优点就只剩下不被 gc 回收吗
|
3
xiaxiaocao 2019-02-15 11:55:26 +08:00
当然比 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 了...
|