什么是 “零” 拷贝?
“零” 拷贝
“零拷贝” 是指 直接内存拷贝到堆内存的次数为零
在理解 “零” 拷贝之前,我们要首先了解拷贝了什么?
首先对于 Java 来说系统的内存分为两部分 堆内存 和 堆外内存 。堆外内存也叫 直接内存。了解 JVM 的同学应该都知道,JVM 元空间的数据就是存储在 直接内存 中的。
在这里首先记住一个结论,在 Java 程序中直接内存相较于堆内存,申请空间较慢,访问数据较快。
内存 | 空间申请 | 数据访问 |
---|---|---|
直接内存 | 较慢 | 较快 |
堆内存 | 较快 | 较慢 |
下面给一段测试代码,感兴趣的同学可以测试着跑一下。
public class DirectMemoryTest {public static final int OUT_FOR_TIME=100000;public static final int IN_FOR_TIME=200;public static void directAccess(){long startTime=System.currentTimeMillis();ByteBuffer buffer= ByteBuffer.allocateDirect(1000);for (int i=0;i<OUT_FOR_TIME;i++){for (int j=0;j<IN_FOR_TIME;j++){buffer.putInt(j);}buffer.flip();for (int j=0;j<IN_FOR_TIME;j++){buffer.getInt();}buffer.clear();}long endTime=System.currentTimeMillis();System.out.println("直接访问内存(堆外内存):"+(endTime-startTime)+" ms");}public static void heapAccess(){long startTime=System.currentTimeMillis();ByteBuffer buffer= ByteBuffer.allocate(1000);for (int i=0;i<OUT_FOR_TIME;i++){for (int j=0;j<IN_FOR_TIME;j++){buffer.putInt(j);}buffer.flip();for (int j=0;j<IN_FOR_TIME;j++){buffer.getInt();}buffer.clear();}long endTime=System.currentTimeMillis();System.out.println("堆内存访问:"+(endTime-startTime)+" ms");}public static void heapAllocate() {long startTime = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {ByteBuffer.allocate(100);}long endTime = System.currentTimeMillis();System.out.println("堆内存申请:" + (endTime - startTime) + "ms");}public static void directAllocate() {long startTime = System.currentTimeMillis();for (int i = 0; i < 100000; i++) {ByteBuffer.allocateDirect(100);}long endTime = System.currentTimeMillis();System.out.println("直接内存申请:" + (endTime - startTime) + "ms");}public static void main(String[] args) {for(int i=0;i<10;i++){heapAccess();directAccess();}System.out.println("");for (int i = 0; i < 10; i++) {heapAllocate();directAllocate();}}
}
public static ByteBuffer allocateDirect(int capacity) {return new DirectByteBuffer(capacity);
}
public static ByteBuffer allocate(int capacity) {if (capacity < 0)throw new IllegalArgumentException();return new HeapByteBuffer(capacity, capacity);
}
直接内存的回收:
- 当 DirectByteBuffer 的引用被回收掉前会触发分配时注册的钩子函数,释放指向的直接内存
- 在申请直接内存前判断是否有足够的直接内存进行分配,判断是否超出设置最大值
-XX:MaxDirectMemorySize
默认为最大堆内存大小,如果不够,System.gc() 显示触发 full gc 进行对象的回收
对于我们 Netty 服务数据的一次收发过程,以客户端向服务端发送数据为例,首先数据会先到 Socket 接收缓冲区中,然后拷贝到直接内存(底层 C 拷贝内核空间),最终拷贝到堆内存(用户空间)才能供我们的 Java 程序使用。那么一次数据的读取就需要两次拷贝,同理 Server 发数据也是一样的,从堆内存拷贝到直接内存,再从直接内存拷贝到 Socket 发送缓冲区。
而 “零拷贝” 是指 直接内存拷贝到堆内存的次数为零 也就是 Java 程序直接读取堆外内存的数据。
而对于在磁盘读取文件来说,也只需要一次磁盘拷贝到直接内存即可,不需要再将数据拷贝到 java 堆内存再进行管理。
什么是 “零” 拷贝?相关推荐
- linux dma拷贝数据到用户态,图解:零拷贝Zero-Copy技术大揭秘
1.前言 像大白这种调包侠,深知不懂底层技术点就如同空中楼阁,再这样下去面阿里p10是没希望了. 想到这里,我开始慌了,所以今天和大家一起学习个底层技术点-零拷贝Zero-Copy. Linux系统中 ...
- jvm 堆外内存_NIO效率高的原理之零拷贝与直接内存映射
更多内容,欢迎关注微信公众号:全菜工程师小辉~ 前言 在笔者上一篇博客,详解了NIO,并总结NIO相比BIO的效率要高的三个原因,彻底搞懂NIO效率高的原理. 这篇博客将针对第三个原因,进行更详细的讲 ...
- CUDA Samples: dot product(使用零拷贝内存)
以下CUDA sample是分别用C++和CUDA实现的点积运算code,CUDA包括普通实现和采用零拷贝内存实现两种,并对其中使用到的CUDA函数进行了解说,code参考了<GPU高性能编程C ...
- 浅析操作系统和Netty中的零拷贝机制
点击关注公众号,Java干货及时送达 零拷贝机制(Zero-Copy)是在操作数据时不需要将数据从一块内存区域复制到另一块内存区域的技术,这样就避免了内存的拷贝,使得可以提高CPU的.零拷贝机制是一种 ...
- Netty、Kafka中的零拷贝技术到底有多牛?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:rrd.me/ggFBd 零拷贝,从字面意思理解就是数据不需 ...
- 面试题:如何理解 Linux 的零拷贝技术?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 本文讲解 Linux 的零拷贝技术,云计算是一门很庞大的技术学科, ...
- 基于Protobuf共享字段的分包和透传零拷贝技术,你了解吗?
导语 | 本文通过介绍实现Protobuf共享字段Guard,并将其应用于中控/召回场景,并获得了显著CPU/时延收益.即使不使用Guard,希望本文的经验和思路也能为读者带来一些帮助和参考. 引言 ...
- 为什么 P8 程序员的代码你写不出来?零拷贝了解一下
计算机处理的任务大体可以分为两类:CPU密集型与IO密集型. 当前流行的互联网应用更多的属于IO密集型,传统的IO标准接口都是基于数据拷贝的,这篇文章我们主要关注该怎样从数据拷贝的角度来优化IO性能, ...
- 图解|零拷贝Zero-Copy技术大揭秘
1.前言 像大白这种调包侠,深知不懂底层技术点就如同空中楼阁,再这样下去面阿里p10是没希望了. 想到这里,我开始慌了,所以今天和大家一起学习个底层技术点-零拷贝Zero-Copy. Linux系统中 ...
- 深入探秘 Netty、Kafka 中的零拷贝技术!
作者:ksfzhaohui 原文:juejin.im/post/5cad6f1ef265da039f0ef5df 零拷贝,从字面意思理解就是数据不需要来回的拷贝,大大提升了系统的性能.我们也经常在 J ...
最新文章
- 邮箱@topgrid.cn是什么网站_典 藏 网 站 !
- Jakarta EE:云原生Java的新平台
- 【问题记录】python的py文件生成exe可执行程序闪退
- bootstrap-select采坑
- 【CodeForces - 270A】Fancy Fence (几何,思维,水题)
- linux simple这个目录哪来的,Arch Linux 碎碎念
- Asp.net 自定义config文件读取
- Mplayer的秘密功能
- Struts2框架中s:if标签和s:set标签小结
- java中的map是什么_Java中Map的使用
- Kinect 数据录制与回放
- 清华大学发布《人工智能芯片技术白皮书(2018)》
- 计算机打印纸如何盖章,怎样使电脑制作的印章具有手动盖章效果
- 【Typecho插件】Typecho百度主动推送插件
- python: del函数
- Gensim库生成与导入W2V模型_CodingPark编程公园
- 任何一台计算机硬件系统都是油,大学生计算机基础第一章.ppt
- html萤火虫特效代码,原生JS实现萤火虫效果
- DT内核圆柱模板行业站点主动tags三项主动推送插件
- AUTO CAD2005简体中文版注册机
热门文章
- 物联网常见协议之Amqp协议及使用场景解析
- LeetCode 387、字符串中的第一个唯一字符
- 5 RRC Measurement -- GAP
- HDU 2544 最短路(最短路入门)
- onsubmit函数触发事件
- 开博第一篇 往后余生,唯愿你幸福
- ROS2入门教程—理解话题(Topic)
- tracking里面几种常见图的画法
- Inventory 物料库存 mtl_transactions_interface 开发[转]
- Markdown (CSDN) MD编辑器(四)- 漂亮表格(表格背景色、跨行、跨列、多行)