10 直接内存
直接内存
直接内存概述
- 直接内存不是虚拟机运行时数据区的一部分。也不是《Java虚拟机规范》中定义的内存区域
- 直接内存是在Jaav堆外的、直接向系统申请的内存空间
- 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存
- 通常访问直接内存的速度高于Java堆,也就是读写性能更高
- 因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存
- Java的NIO库允许Java程序使用直接内存,用户数据缓冲区
使用下列代码,直接分配本地内存空间
int BUFFER = 1024*1024*1024; // 1GB
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER);
非直接缓冲区
直接缓冲区
- 使用NIO的时候,上图。操作系统划出的直接缓存区可以被Java代码直接访问,只有一份,NIO适合对大文件的读写操作。
注意点
- 也可能导致OutOfMemoryError异常
- 由于直接内存存在在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆大小,但是系统内存是有限的,Java堆和直接内存的总和依旧受限于操作系统能给出的操作内存
- 缺点
- 分配回收成本高
- 不受JVM内存回收管理
- 直接内存的大可以通过 MaxDirectMemorySize 设置
- 如果不指定,默认与堆的最大值 -Xmx参数保持一致
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)