请教大家一个问题,netty用这个堆外内存怎么就能提升效率了,比如我现在想发送一个消息
String msg ="hello world";,首先这个msg对象肯定是在堆内创建的
然后msg序列化得到 bytes[]数组。把bytes[]数组写到堆外内存。
由于现在数据已经在堆外了,所以可以直接发送到内核缓冲区。看着是减少了一次拷贝,但是在把msg序列化之后写到堆外内存中,这本身也是一次复制吧,优化在哪里?
难道java可以直接在堆外创建对象吗? 

解决方案 »

  1.   

    netty在内存方面的优化是 内存的 零拷贝
    java有对应的api可以理解为如果你要发送一些数据,先要将数据从 应用缓冲区拷贝到 内核缓冲区而零拷贝相当于是把内存地址映射过去了当发送的数据量大时候,就省了拷贝,提示性能
      

  2.   

    你可以看看这个
    https://www.jianshu.com/p/6a490f5f0702
      

  3.   

    这是所谓零拷贝,用传统方式BIO来读写数据需要读写四次数据:
    1、从IO读到磁盘缓存
    2、从磁盘缓存读到内存
    3、从内存写入到IO缓存
    4、IO缓存写入到指定数据流。
    其实从这个过程就可以看到,传统的读写数据是把数据读取到内存进行了一次拷贝然后再写入到对应的数据流中,其实第二步和第三步是没有必要的,这个过程不但消耗CPU资源同时也消耗内存资源,所以最好就是省略掉中间两步,直接从IO读取到数据然后再直接写入到对应的数据流中。
    但是这种直接读写的操作并不是所有操作系统都支持的,只有比较新的操作系统有支持,老的操作系统不能使用这种方式,还只能使用传统的四步通过内存cpoy一次数据再发送。
    java有对应的nio来使用这种操作系统的新功能,只是其中有一些bug,netty通过重新封装来修正了一些这些bug并重新进行了架构来让编码变得简单而已。