V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mortonnex
V2EX  ›  问与答

Java 的 directByteBuffer 的问题

  •  
  •   mortonnex · 2019-02-15 10:47:26 +08:00 · 1309 次点击
    这是一个创建于 1869 天前的主题,其中的信息可能已经有所发展或是发生改变。
    directByteBuffer 到底是属于用户空间还是内核空间?
    5 条回复    2019-02-15 20:45:58 +08:00
    xiaxiaocao
        1
    xiaxiaocao  
       2019-02-15 11:00:32 +08:00
    ByteBuffer.allocateDirect 是使用 mmap 分配的,都是在用户空间的内存
    mortonnex
        2
    mortonnex  
    OP
       2019-02-15 11:27:35 +08:00
    @xiaxiaocao 所以用 directBuffer 的效率并不会比 heapBuffer 高? 优点就只剩下不被 gc 回收吗
    xiaxiaocao
        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
    mortonnex
        4
    mortonnex  
    OP
       2019-02-15 20:45:40 +08:00
    #3
    谢谢回复!
    1. "Java 的实现 direct buffer 也是在 GC 的时候回收" 这个有依据吗
    2. 如果是通过 JNA 操作的 direct 内存, 是不会被 java 的 GC 管理的对吧
    mortonnex
        5
    mortonnex  
    OP
       2019-02-15 20:45:58 +08:00
    @xiaxiaocao 刚刚忘记 at 了...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3613 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:36 · PVG 12:36 · LAX 21:36 · JFK 00:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.