添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
阳刚的煎鸡蛋  ·  has no attribute ...·  9 月前    · 
爽快的哑铃  ·  time - Making a ...·  1 年前    · 

在Java中当我们要对数据进行更底层的操作时,一般是操作数据的字节(byte)形式,这时经常会用到ByteBuffer这样一个类。ByteBuffer提供了两种静态实例方式:

public static ByteBuffer allocate(int capacity)  
public static ByteBuffer allocateDirect(int capacity)  

为什么要提供两种方式呢?这与Java的内存使用机制有关。第一种分配方式产生的内存开销是在JVM中的,而另外一种的分配方式产生的开销在JVM之外,也就是系统级的内存分配(os::malloc())。当Java程序接收到外部传来的数据时,首先是被系统内存所获取,然后在由系统内存复制复制到JVM内存中供Java程序使用。所以在另外一种分配方式中,能够省去复制这一步操作,效率上会有所提高。可是系统级内存的分配比起JVM内存的分配要耗时得多(需要陷入一次内核态),所以并非不论什么时候allocateDirect的操作效率都是最高的。以下是一个不同容量情况下两种分配方式的操作时间对照:
在这里插入图片描述
由图能够看出,当操作数据量非常小时,两种分配方式操作使用时间基本是同样的,第一种方式有时可能会更快,可是当数据量非常大时,DirectAllocate远远大于Allocate。

ios-byteBuffer [![CI状态]( Lee / ios-byteBuffer.svg?style = flat)]( Lee / ios-byteBufferByteBuffer *buffer = [ByteBuffer initWithOrder: ByteOrderLittleEndian]; #输入数据 - ( void )put:( Byte )b; - ( void )putByteBuffer:(ByteBuffer*)bb; - ( void )putData:( NSData *)data; - ( void )putShort:( short )d; - ( void )putFloat:( float )f; - ( void )putInt:( int )i; - ( Byte )get:( int )index; 本文实例讲述了Android在JNI使用ByteBuffer的方法。分享给大家供大家参考。具体如下: 一、ByteBuffer 定义 在NIO,数据的读写操作始终是与缓冲区相关联的(读取时信道(SocketChannel)将数据读入缓冲区,写入时首先要将发送的数据按顺序填入缓冲区) 缓冲区是定长的,基本上它只是一个列表,它的所有元素都是基本数据类型。ByteBuffer是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道的读写方法只接收ByteBufferByteBuffer有以下几种常见属性: mark:初始值为-1,标记索引地点; position:初始值为0,索引下标;     // Primary constructor     DirectByteBuffer(int cap) {                   // package-private         super(- 在前边的系列文章,我们从内核如何收发网络数据开始以一个C10K的问题作为主线详细从内核角度阐述了网络IO模型的演变,最终在此基础上引出了Netty的网络IO模型如下图所示:后续我们又围绕着Netty的主从Reactor网络IO线程模型,在《Reactor模型在Netty的实现》一文详细阐述了Netty的主从Reactor模型的创建,以及介绍了Reactor模型的关键组件。搭建了Netty的核心骨架如下图所示:在核心骨架搭建完毕之后,我们随后又在《详细图解Reactor启动全流程》一文阐述了React 首先,我对JNA和Java如何直接本机内存分配的理解是最内在的,因此,我试图描述我对正在发生的事情的理解。除了回应以外的任何更正都会很棒。我正在运行一个使用JNA混合Java和C本机代码的应用程序,并且遇到了一个可重现的问题,Java垃圾收集器无法释放对直接本机内存分配的引用,导致C堆内存不足。我很肯定我的C应用程序不是分配问题的根源,因为我正在将java.nio.ByteBuffer传递到我的C... 文章目录一、堆内内存与堆外内存二、内存对象初始化三、内存数据读写四、内存释放五、Cleaner机制和Finalizer机制六、JAVA四种引用类型七、章节总结 === 楼兰 === ​ 这一节,将重点来讨论NIO的Buffer。彻底理解清楚Buffer是个什么样的东西。 一、堆内内存与堆外内存 ​ 关于Buffer,在基础篇已经做过简单介绍。他是网络IO数据与本地数据的缓冲。Nio相关数据都是通过Buffer来携带。在这一部分,就来深入看看这个Buffer到底是什么。 ​ 实际上Buff 基本概念: JVM可以使用的内存分外2种:堆内存和堆外内存,堆内存完全由JVM负责分配和释放,如果程序没有缺陷代码导致内存泄露,那么就不会遇到java.lang.OutOfMemoryError这个错误。使用堆外内存,就是为了能直接分配和释放内存,提高效率。 我的理解: Unsafe.allocateMemory分配堆外内存,Unsafe.freeMemory释放堆外内存,分配内存通过ByteBuffer.allocateDirect创建DirectByteBuffer对象并分配内存,同时记录相关分 处置从allocateMemory或reallocateMemory获得的本地内存块。 传递给此方法的地址可以为null,在这种情况下,不采取任何措施。 ![](https://img-blog.csdnimg.cn/20210215150030454.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGV 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 pdGk,shado. mark:记录了当前所标记的索引下标; position:对于写入模式,表示当前可写入数据的下标,对于读取模式,表示接下来可以读取的数据的下标; limit:对于写入模式,表示当前可以写入的数组大小,默认为数组的最大长度,对于读取模式,表示当... 当我们进行数据传输的时候,往往需要使用到缓冲区,常用的缓冲区就是JDK NIO类库提供的java.nio.Buffer。 实际上,7种基础类型(Boolean除外)都有自己的缓冲区实现,对于NIO编程而言,我们主要使用的是ByteBuffer。从功能角度而言,ByteBuffer完全可以满足NIO编程的需要,但是由于NIO编程的复杂性,ByteBuff... ByteBuffer(方法演示2(allocate堆内存和allocateDirect直接内存))Allocate:java堆内存:读写效率低,收到gc的影响(因为我们的java对象也是存在堆内存的)!!!Gc的影响堆内存:想象一个场景,其我在对内存写入了数据,这个时候我们的java虚拟机出现了内存不足,就触发了gc垃圾回收器。这向buffer写入数据的方法(channel的read和buffer的put)Allocate:java堆内存。向buffer分配空间的方法。而直接内存是不受gc影响的。