直接内存:堆外内存与NIO
引言:突破JVM堆的限制 当你使用NIO进行文件操作或网络通信时: // NIO的文件读取 FileChannel channel = FileChannel.open(Paths.get("file.txt")); ByteBuffer buffer = ByteBuffer.allocateDirect(1024); // 直接内存 channel.read(buffer); 这里的 ByteBuffer.allocateDirect() 分配的内存并不在JVM堆中,而是在 堆外内存(Direct Memory),也称为 直接内存。 为什么需要直接内存? 避免Java堆与本地内存之间的数据复制 提升IO性能(零拷贝) 不受GC管理,减少GC压力 适合大数据量、高吞吐量的场景 理解直接内存是掌握高性能IO编程的关键。 什么是直接内存? 核心定义 直接内存(Direct Memory) 是JVM堆之外的内存区域,位于 本地内存(Native Memory),由操作系统管理。 关键特点: 不属于JVM规范定义的内存区域(但实际广泛使用) 不受JVM堆大小限制(受限于物理内存) 不受GC管理(手动释放或通过Cleaner机制) 读写性能高(避免Java堆与本地内存之间的复制) 直接内存 vs 堆内存 对比维度 直接内存 堆内存 位置 本地内存(Native Memory) JVM堆内存 分配方式 ByteBuffer.allocateDirect() new byte[] 或 ByteBuffer.allocate() GC管理 不受GC管理 受GC管理 读写性能 高(零拷贝) 较低(需复制) 分配速度 较慢 较快 释放方式 手动或Cleaner机制 GC自动回收 大小限制 -XX:MaxDirectMemorySize -Xmx 溢出异常 OutOfMemoryError: Direct buffer memory OutOfMemoryError: Java heap space 为什么需要直接内存? 传统IO的性能瓶颈 传统IO流程(使用堆内存): ...