ByteBuffer中allocate 与allocatDirect 不同之处?

简介:

在NIO中,使用ByteBuffer分配缓存区的方式有哪些?


一、创建Buffer对象的方式?

1、JVM堆中分配内存,

2、也可以OS本地内存中分配,由于本地缓冲区避免了缓冲区复制,在性能上相对堆缓冲区有一定优势,但同时也存在一些弊端。

二、两种缓冲区对应的API如下:

1、JVM堆缓冲区:ByteBuffer.allocate(size)

2、本地缓冲区:ByteBuffer.allocateDirect(size)//属于系统级的内存开销,就是操作系统直接分配的

三、ByteBuffer对象的垃圾回收策略?

1、从堆中分配的缓冲区为普通的Java对象,生命周期与普通的Java对象一样,当不再被引用时,Buffer对象会被回收。

2、直接缓冲区(DirectBuffer)为本地内存,并不在Java堆中,也不能被JVM垃圾回收。由于直接缓冲区在JVM里被包装进Java对象DirectByteBuffer中,当它的包装类被垃圾回收时,会调用相应的JNI方法释放本地内存,所以本地内存的释放也依赖于JVMDirectByteBuffer对象的回收。

 

由于垃圾回收本身成本较高,一般JVM在堆内存未耗尽时,不会进行垃圾回收操作。我们知道在32位机器上,每个进程的最大可用内存为4G,用户可用内存在大概为3G左右,如果为堆分配过大的内存时,本地内存可用空间就会相应减少。当我们为堆分配较多的内存时,JVM可能会在相当长的时间内不会进行垃圾回收操作,从而本地内存不断分配,无法释放,最终导致OutOfMemoryError

 

四、总结:

1、堆缓冲区的性能已经相当高,若无必要,使用堆缓冲区足矣。若确实有提升性能的必要时,再考虑使用本地缓冲区。

2、JVM分配堆内存时,并不是越大越好,堆内存越大,本地内存就越小,根据具体情况决定,主要针对32位机器,64位机器上不存在该问题。














本文转自故新51CTO博客,原文链接:http://blog.51cto.com/xingej/1967948 ,如需转载请自行联系原作者













相关文章
|
3月前
muduo源码剖析之Buffer缓冲区类
Buffer封装了一个可变长的buffer,支持廉价的前插操作,以及内部挪腾操作避免额外申请空间使用vector作为缓冲区(可自动调整扩容)
35 0
muduo源码剖析之Buffer缓冲区类
|
5月前
Cache 和 Buffer 有什么区别?
Cache 和 Buffer 有什么区别?
|
7月前
|
存储
ByteBuffer 大小分配
ByteBuffer 大小分配
51 0
|
12月前
|
JSON 数据格式
Buffer 对象
Buffer 对象
|
Java
|
JavaScript 网络协议 前端开发
Buffer 类型介绍|学习笔记
快速学习 Buffer 类型介绍
484 0
Buffer 类型介绍|学习笔记
|
存储 SQL 缓存
写缓冲(change buffer),这次彻底懂了!!!
一次了解缓冲池(buffer pool)。
492 0
写缓冲(change buffer),这次彻底懂了!!!
|
缓存 Linux 存储
Linux内存buffer和cache的区别
在Linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。
2318 0