伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

浅析Java、Netty零拷贝

来源:本站原创 浏览:94次 时间:2022-12-02

缓冲IO


通常应用程序访问硬盘数据或接收网络数据,数据会先被操作系统缓冲到内核缓冲区,再由应用程序copy到本地内存(用户空间),对于java来说就是JVM进程所占用的内存空间。

内存映射


相比于前面的缓冲IO,内存映射不再将数据copy到本地内存,而是在本地内存使用逻辑地址映射到内核空间,实际读写的是内核缓冲区,这样就减少了由内核缓冲区到应用程序本地内存的数据copy。

transferTo











public static void copyFileByChannel(File in, File out) {     FileChannel src = new FileInputStream(in).getChannel();     FileChannel tgt = new FileOutputStream(out).getChannel();     for (long count = src.size(); count > 0; ) {     long transferred = src.transferTo(src.position(), count, tgt);     src.position(src.position() + transferred);          count -= transferred;     }}
上面是一个使用FileChannel的简单示例,可以看到通过FileChannel的transferTo方法可以直接将输入管道传输至输出的管道。正常的读写,我们需要先将输入数据读取到本地内存,再将本地内存输出到目标文件,显然使用transferTo在用户空间减少了copy。

DirectByteBuffer



ByteBuffer byteBuf = ByteBuffer.allocateDirect(1024);

见名知义,DirecByteBuffer是将在堆外内存上进行分配、使用、回收。直接内存可以减少本地内存copy,对于IO密集型程序是可以带来性能优势的。同时由于直接内存在堆外,所以创建和销毁相比堆上Buffer会有额外的开销。通常垃圾回收不会主动回收这部分内存,所以保险起见应该主动去释放这部分内存空间,netty就是通过引用计数来回收直接内存的。

netty零拷贝


netty零拷贝参见上述Java的两种方式,毕竟netty是一个高性能Java框架。除了上述方法,netty还有许多工具组件,减少了我们在本地内存数据copy,比如CompositeByteBuf可以通过组合内存的方式把内存数据包组合到一起,比如ByteBuf的slice方法,可以创建一个共享对象而不改变原对象指针等。

总结


对于硬盘的输入输出零拷贝同样适用于网络数据的收发;对于Java而言零拷贝就是在用户空间减少了多余的数据拷贝。


  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net