在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
[]( Lee / ios-byteBuffer )
ByteBuffer *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是最常用的缓冲区,它提供了读写其他数据类型的方法,且信道的读写方法只接收ByteBuffer。
ByteBuffer有以下几种常见属性:
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,在这种情况下,不采取任何措施。
都有自己的缓冲区实现,对于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影响的。