6. JVM直接内存
1. 什么是直接内存
直接内存是 Java 中一种特殊的内存分配方式,它允许Java程序直接访问操作系统的本地内存,绕过Java堆内存的管理机制。
这种内存不属于Java虚拟机(JVM)运行时数据区的一部分,而是在JVM之外由操作系统管理的内存区域。
主要特点
绕过JVM堆内存:直接内存分配不受Java堆大小限制(-Xmx参数)
本地IO操作高效(常用于NIO操作):减少了数据在Java堆和本地堆之间的复制
分配成本较高:创建和销毁的开销比堆内存大
手动管理:需要显式释放,不像堆内存由GC自动回收
应用场景:
- 需要频繁进行IO操作的场景(如NIO网络编程)
- 需要处理大容量数据且希望减少GC影响的场景
- 需要与本地代码交互的场景
2. JVM堆内存与直接内存的区别
2.1 IO 与 NIO 的区别
常规 IO 的拷贝流程:
NIO 的拷贝流程:
2.2 内存的本质区别
JVM的内存结构
堆内存(Heap Memory):由JVM管理,存放Java对象(受
-Xmx
等参数限制)。非堆内存(Non-Heap Memory):包括方法区(Metaspace)、JIT代码缓存等,也由JVM管理。
直接内存(Direct Memory):不在JVM运行时数据区内,而是通过JVM代码(如
ByteBuffer.allocateDirect()
)向操作系统申请的本机内存。
直接内存的来源
直接内存是通过JVM进程向操作系统申请的本机内存(Native Memory),属于你的电脑物理内存(或OS虚拟内存)的一部分。
例如,在Linux下,JVM调用
malloc()
或mmap()
申请内存;在Windows下可能调用VirtualAlloc()
。
为什么叫"直接"内存?
因为这块内存可以直接被Java的NIO Buffer(如
DirectByteBuffer
)访问,而不需要经过JVM堆内存的拷贝。例如,读取文件时,数据可以直接从OS缓存写入直接内存,再被Java访问,避免了堆内外的数据复制
总结
内存类型 | 管理方 | 存储位置 | 是否受GC管理 |
---|---|---|---|
JVM堆内存 | JVM | JVM进程内 | 是(GC回收) |
直接内存 | 用户代码(通过JNI) | 本机内存(物理/虚拟) | 否(需手动或Cleaner 回收) |
上一篇 下一篇