Java直接(堆外)内存使用详解直接(堆外)内存使用详解
本篇主要讲解如何使用直接内存(堆外内存),并按照下面的步骤进行说明:
相关背景–>读写操作–>关键属性–>读写实践–>扩展–>参考说明
希望对想使用直接内存的朋友,提供点快捷的参考。
数据类型
下面这些,都是在使用DirectBuffer中必备的一些常识,暂作了解吧!如果想要深入理解,可以看看下面参考的那些博
客。
基本类型长度
在Java中有很多的基本类型,比如:
byte,一个字节是8位bit,也是1B
short,16位bit,也是2B
int,32位bit,也是4B
long, 64位bit,也是8B
char,16位bit,也是2B
float,32位bit,也是4B
double,64位bit,也是8B
不同的类型都会按照自己的位数来存储,并且可以自动进行转换提升。
byte、char、short都可以自动提升为int,如果操作数有long,会自动提升为long,float和double也是如此。
大端小端
由于一个数据类型可能有很多个字节组成的,那么它们是如何摆放的。这个是有讲究的:
大端:低地址位 存放 高有效字节
小端:低地址位 存放 低有效字节
举个例子,一个char是有两个字节组成的,这两个字节存储可能会显示成如下的模样,比如字符a:
低地址位 高地址位
大端; 00 96
小端: 96 00
String与new String的区别
再说说"hello"和new String("hello")的区别:
如果是"hello",JVM会先去共享的字符串池中查找,有没有"hello"这个词,如果有直接返回它的引用;如果没有,会创建
这个对象,再返回。因此,"a"+"b"相当于存在3个对象,分别是"a"、"b"、"ab"。
而new String("hello"),则省去了查找的过程,直接创建一个hello的对象,并且返回引用。
读写数据
在直接内存中,通过allocateDirect(int byte_length)申请直接内存。这段内存可以理解为一段普通的基于Byte的数组,因
此插入和读取都跟普通的数组差不多。
只不过提供了基于不同数据类型的插入方法,比如:
put(byte) 插入一个byte
put(byte[]) 插入一个byte数组
putChar(char) 插入字符
putInt(int) 插入Int
putLong(long) 插入long
等等….详细的使用方法,也可以参考下面的图片:
对应读取数据,跟写入差不多: