netty-DirectByteBuffer

Buffer的种类

在这里插入图片描述

就类型而言,Buffer总共有七种基本的对象,但是从底层来看,最大的区别只在于HeapDirect的区别。

HeapJVM堆内存

DirectOS直接内存

I/O的关系

和硬件设备打交道,必定是操作系统os的工作。

JVM只是OS之上的再组织,根源操作仍然是OS进行的操作。

device
OS
JVM
disk
linux
javaProgram

两种Buffer的对比

那么,HeapDirect在哪呢。

根据前文所述,Heap就在JVM内部,Direct应该在OS

不过我们先申明几点

  • 对象:不论内存空间在哪,JVM中总有对象
  • 内存:不论内存在哪,OS总能管理
  • 数据交换:I/O要交换的数据,一定都在OS管理下
device
OS
JVM
copy
I/O
address
I/O
disk
heapMemoryCopy
directMemory
heapObject
directObject
heapMemory

为什么要拷贝HeapMemoryOS

OS命名能够管理任意的内存,虽然heapJVM内部,但是仍然能够拿到,为甚么需要拷贝出来呢?

由于GC垃圾回收的缘故,导致内存数据可能被挪动,但是OS自有管理,不会去迁就JVM

导致操作数据时会发生数据改变或丢失。

但是,OS直接和device进行交互,交换数据一定要让OS进行管理。

OSHeapMemory直接进行管理,数据不安全,需要先拷贝出来。

Direct如何引用OS内存?

Buffer中存在一个address属性,这里就是堆外内存地址,直接在OS中JVM外进行数据操作。

因此不涉及交换数据拷贝操作,效率更高。

两种方式何时释放?

  • heap

    • heapObject销毁时释放heapMemory
    • OS完成I/O操作后自动释放
  • direct

    • directObject销毁时自动释放address的内存,也就是directMemory

内存映射文件对象

direct的办法,就是在JVM内存中的变化,直接改变到OS上。

不是调用什么去完成操作,而是直接操作的效果。

direct继承的Mapped就是干这个的。

public class MappedMain {
    public static void main(String[] args) throws Exception{
        RandomAccessFile file =  new RandomAccessFile("test.txt", "rw");
        MappedByteBuffer mappedByteBuffer = file.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 26);
        char ch = 'a';
        while(mappedByteBuffer.hasRemaining()){
            mappedByteBuffer.putChar(ch);
            ch += 1;
        }
        file.close();
    }
}

我们做了什么,我们只是操作了内存中的MappedByteBuffer,不过,你文件浏览器打开文件看看。

文件直接就已经被修改了。

也就是说,我们内存中的直接操作,直接影响了OS的文件内容。

小结

所以说Direct为什么快呢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值