在 Java 中,直接内存(Direct Memory)是指不受 JVM 堆管理、直接向操作系统申请的一块 native 内存。它不属于 Java 堆,也不受 JVM 垃圾回收器(GC)直接管理,但通过 Java 代码可以访问和使用。
直接内存(Direct Memory / Off-Heap Memory):
java.nio 包中的 ByteBuffer.allocateDirect() 创建| 对比项 | 堆内存(Heap) | 直接内存(Direct Memory) |
|---|---|---|
| 所在位置 | JVM 内部 | 操作系统内存 |
| 管理方 | JVM GC | 操作系统 + JVM 间接管理 |
| 创建方式 | new Object() |
ByteBuffer.allocateDirect() |
| 访问速度 | 较慢(多一次拷贝) | 快(少一次拷贝) |
| GC 影响 | 直接受 GC 影响 | 不受 GC 直接管理 |
| 大小限制 | -Xmx |
-XX:MaxDirectMemorySize |
传统 IO:
堆内存 → 内核缓冲区 → 网卡
NIO + 直接内存:
直接内存 → 网卡
✅ 少了一次内存拷贝,性能更高
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
buffer.put("hello".getBytes());
buffer.flip();
⚠️ 注意:
Cleaner + 虚引用回收-XX:MaxDirectMemorySize=512m
不设置时:
-XmxMaxDirectMemorySize✅ Netty
✅ Kafka
✅ RocketMQ
✅ 高性能网络框架
✅ 大文件传输
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。