没有合适的资源?快使用搜索试试~ 我知道了~
深入解读 Java 堆外内存(直接内存)1
需积分: 0 1 下载量 168 浏览量
2022-08-03
22:23:17
上传
评论
收藏 6.71MB PDF 举报
温馨提示
试读
8页
1.引言很久没有遇到堆外内存相关的问题了,五一假期刚结束,便不期而遇,以前也处理过几次这类问题,但都没有总结,觉得是时候总结一下了。先来看一个 Demo:在 D
资源详情
资源评论
资源推荐
深入解读 Java 堆外内存(直接内存)
查看本场Chat
(https://gitbook.cn/gitchat/activity/5af07387585c260a21a32b97)
应书澜 (https://gitbook.
…
向作者提问 (https ://gitbook.cn/m/mazi/author/5a98122bfdc2050df046d997/question)
(https://gitbook.cn/gitchat/author/5a98122bfdc2050df046d997)
毕业于C9高
校,硕士学
历,曾在IEEE ITS、VSD等Top期刊发表论文。多年研发经验,擅长嵌入式&物联网相
关技术,预测算法,分布式中间件,精通Java、Python及C语言;曾在华为、阿里巴
巴,上海电气,浙能集团等公司重要项目中担任技术负责人或核心研发成员,现专注
于中间件技术。
1. 引言
很久没有遇到堆外内存相关的问题了,五一假期刚结束,便不期而遇,以前也
处理过几次这类问题,但都没有总结,觉得是时候总结一下了。
先来看一个 Demo:在 Demo 中分配堆外内存用的是 allocateDirect 方法,但其内部调用的是
DirectByteBuffer,换言之,DirectByteBuffer 才是实际操作堆外内存的类,因此,本场 Chat 将
围绕 DirectByteBuffer 展开。
import java.nio.ByteBuffer;
public class Demo
{
public static void main( String[] args )
{
//分配一块1024Bytes的堆外内存(直接内存)
//allocateDirect方法内部调用的是DirectByteBuffer
ByteBuffer buffer=ByteBuffer.allocateDirect(1024);
System.out.println(buffer.capacity());
//向堆外内存中读写数据
buffer.putInt(0,2018);
System.out.println(buffer.getInt(0));
}
}
2. 什么是堆外内存?
Java 开发者一般都知道堆内存,但却未必了解堆外内存。事实上,除了堆内存,Java 还可以使
用堆外内存,也称直接内存(Direct Memory)。顾名思义,堆外内存是在 JVM Heap 之外分配
的内存块,并不是 JVM 规范中定义的内存区域,堆外内存用得并不多,但十分重要。
读者也许会有一个疑问:既然已经有堆内存,为什么还要用堆外内存呢?这主要是因为堆外内
存在 IO 操作方面的优势,举一个例子:在通信中,将存在于堆内存中的数据 flush 到远程时,需
要首先将堆内存中的数据拷贝到堆外内存中,然后再写入 Socket 中;如果直接将数据存到堆外
内存中就可以避免上述拷贝操作,提升性能。类似的例子还有读写文件。
目前,很多 NIO 框架 (如 netty,rpc) 会采用 Java 的 DirectByteBuffer 类来操作堆外内存,
DirectByteBuffer 类对象本身位于 Java 内存模型的堆中,由 JVM 直接管控、操纵。但是,
DirectByteBuffer 中用于分配堆外内存的方法 unsafe.allocateMemory(size) 是个一个 native 方
法,本质上是用 C 的 malloc 来进行分配的。分配的内存是系统本地的内存,并不在 Java 的内
存中,也不属于 JVM 管控范围,所以在 DirectByteBuffer 一定会存在某种特别的方式来操纵堆
外内存。
3. 堆外内存创建过程深度解析
(https://gitbook.cn/)
荀烨@学而-大数据(教育)
洪蛋蛋
- 粉丝: 21
- 资源: 335
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0