003 零拷贝

一 概述

  在传统的io之中,我们复制数据都是通过堆内存完成的,但是操作系统却不是这样进行操作的,只是jdk为了维护一致的操作方法进行实现的.

  在之前的io模型之中,比如文件的读取,我们首先将数据复制到内核内存之中,然后我们需要将数据复制到堆内存之中,然后才进行的操作.

  其实,在上面的模型之中,我们不自觉的完成的内存的数据复制,其实这种复制是没有必要的,但是我们想要去掉这个数据复制,使用java本身是不能实现的,因此jdk使用了调用jni的方式实现了数据的零拷贝,让我们的java程序直接操作内核数据.

  上面的这种方式也就是我们所说的零拷贝.


二 . 直接缓冲区

  在nio之中,我们对数据的操作都是依赖缓冲区对象的,之前我们也介绍了缓冲区可以分成两种:

[1]非直接缓冲区:我们使用堆内存进行数据的操作.

[2]:直接缓冲区:我们通过这种缓冲区实现零拷贝.

首先,我们回顾一下怎么使用直接缓冲区.

        // 创建了一个直接缓冲区
        // 实际上和我们创建的非直接缓冲区再使用上没有任何的区别.
        ByteBuffer buffer = ByteBuffer.allocateDirect(10);
public abstract class ByteBuffer
    extends Buffer
    implements Comparable<ByteBuffer>
{

    // These fields are declared here rather than in Heap-X-Buffer in order to
    // reduce the number of virtual method invocations needed to access these
    // values, which is especially costly when coding small buffers.
    //
    final byte[] hb;                  // Non-null only for heap buffers
    final int offset;

在红色部分,标记了一个偏移量,这个偏移量就是内核内存的存储位置.

原文地址:https://www.cnblogs.com/trekxu/p/10169080.html