概念
Zero Copy
- 0拷贝,速度快
- 操作数据时, 不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域. 因为少了一次内存的拷贝, 因此 CPU 的效率就得到的提升.
- 在 OS 层面上的 Zero-copy 通常指避免在 用户态(User-space) 与 内核态(Kernel-space) 之间来回拷贝数据. 例如 Linux 提供的 mmap 系统调用, 它可以将一段用户空间内存映射到内核空间, 当映射成功后, 用户对这段内存区域的修改可以直接反映到内核空间; 同样地, 内核空间对这段区域的修改也直接反映用户空间. 正因为有这样的映射关系, 我们就不需要在 用户态(User-space) 与 内核态(Kernel-space) 之间拷贝数据, 提高了数据传输的效率.
而需要注意的是, Netty 中的 Zero-copy 与上面我们所提到到 OS 层面上的 Zero-copy 不太一样, Netty的 Zero-coyp 完全是在用户态(Java 层面)的, 它的 Zero-copy 的更多的是偏向于 优化数据操作 这样的概念.
实操
代码
服务器
新建Maven项目:
添加插件:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<!-- // 可以添加对应的执行阶段-->
<phase>test</phase>
<!-- ...-->
<goals>
<!-- // 指定来的 goal为java,表示运行java程序-->
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- // 指定了运行的main class-->
<mainClass>com.cc.netty.server.EchoServer</mainClass>
<!-- // 执行运行 main class的参数-->
<!-- // 其实就是传入main方法的String[]-->
<arguments>
<argument>argument1</argument>
<!-- ...-->
</arguments>
<!-- // 运行java的程序的系统参数-->
<systemProperties>
<systemProperty>
<key>myproperty</key>
<value>myvalue</value>
</systemProperty>
<!-- ...-->
</systemProperties>
</configuration>
</plugin>
执行mvn exec:java
:
报错:
说明插件里的参数有问题。