Java 的 directByteBuffer 的问题

2019-02-15 10:47:26 +08:00
 mortonnex
directByteBuffer 到底是属于用户空间还是内核空间?
1392 次点击
所在节点    问与答
5 条回复
xiaxiaocao
2019-02-15 11:00:32 +08:00
ByteBuffer.allocateDirect 是使用 mmap 分配的,都是在用户空间的内存
mortonnex
2019-02-15 11:27:35 +08:00
@xiaxiaocao 所以用 directBuffer 的效率并不会比 heapBuffer 高? 优点就只剩下不被 gc 回收吗
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
mortonnex
2019-02-15 20:45:40 +08:00
#3
谢谢回复!
1. "Java 的实现 direct buffer 也是在 GC 的时候回收" 这个有依据吗
2. 如果是通过 JNA 操作的 direct 内存, 是不会被 java 的 GC 管理的对吧
mortonnex
2019-02-15 20:45:58 +08:00
@xiaxiaocao 刚刚忘记 at 了...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/535198

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX