Java的直接内存(Direct Memory)是什么意思?

embedded/2025/2/11 12:07:19/

直接内存:

直接内存(Direct Memory) 指的是 JVM 之外直接向操作系统申请的一块内存区域。它不受 JVM 堆(Heap)大小的限制,而是由操作系统的 本机内存(Native Memory) 管理。


1. 为什么需要直接内存?

直接内存的主要目的是提高 I/O 读写性能,因为它可以绕过 Java 堆,直接和操作系统交互,减少数据在 JVM 内部的复制次数。

在 Java 里面,所有数据最终都需要从内存到 CPU 处理,而 Java 传统的堆内存操作涉及多次复制:

  • Java 堆JVM 本地方法操作系统内核缓冲区磁盘或网络
  • 传统方式下,每次 I/O 操作,数据必须从堆复制到本地缓冲区,然后再写入操作系统,这会影响性能。

直接内存的优势: ✅ 减少数据拷贝,提升 I/O 速度
避免 GC 干扰(垃圾回收不会管理直接内存)

常见的使用场景

  • NIO(New IO):Java NIO 提供的 ByteBuffer.allocateDirect() 允许分配直接内存,避免 I/O 复制。
  • Netty:高性能网络框架 Netty 也大量使用直接内存来优化网络通信。
  • 数据库驱动(如 MySQL JDBC Driver):某些数据库驱动(如 MySQL Connector)会使用直接内存加速数据传输。

2. 直接内存的分配

直接内存不受 Java 堆的 -Xmx 限制,但受 操作系统总内存-XX:MaxDirectMemorySize 限制。

(1) 使用 ByteBuffer.allocateDirect() 申请直接内存

import java.nio.ByteBuffer;public class DirectMemoryDemo {public static void main(String[] args) {// 申请 100MB 直接内存ByteBuffer buffer = ByteBuffer.allocateDirect(100 * 1024 * 1024);System.out.println("直接内存分配成功!");}
}

解释

  • ByteBuffer.allocateDirect(size) 会在堆外申请 size 大小的内存。
  • 直接内存不会受 GC 影响,但需要手动释放(否则可能 OOM)。

3. 直接内存的限制

虽然直接内存有优势,但也有一些缺点和限制

(1) 受 -XX:MaxDirectMemorySize 限制

JVM 参数 -XX:MaxDirectMemorySize 控制最大直接内存大小,例如:

java -XX:MaxDirectMemorySize=512M DirectMemoryDemo

如果分配的直接内存超过限制,会抛出 OutOfMemoryError: Direct buffer memory

(2) 不能被 GC 直接回收

直接内存不会受到 Java GC 的管理,因此:

  • 如果程序没有释放直接内存,会造成内存泄漏。
  • GC 只会在 ByteBuffer 对象被回收时,尝试释放直接内存,但释放时间不可控。

(3) 需要手动释放

  • Java NIO 的 ByteBuffer.allocateDirect() 申请的直接内存是由 Cleaner 进行回收的,但不会立即释放。
  • 可以用反射调用 Cleaner.clean() 方法手动释放
import sun.misc.Cleaner;
import java.nio.ByteBuffer;
import java.lang.reflect.Method;public class DirectMemoryClean {public static void main(String[] args) throws Exception {ByteBuffer buffer = ByteBuffer.allocateDirect(100 * 1024 * 1024);System.out.println("直接内存分配成功!");// 释放直接内存Method cleanerMethod = buffer.getClass().getMethod("cleaner");cleanerMethod.setAccessible(true);Cleaner cleaner = (Cleaner) cleanerMethod.invoke(buffer);cleaner.clean();System.out.println("直接内存已释放!");}
}

由于 Cleaner 需要 sun.misc 包,Java 9+ 之后推荐使用 Unsafe 或者 Netty 的 PlatformDependent.freeDirectBuffer() 进行释放


4. 直接内存 vs Java 堆内存

对比项直接内存(Direct Memory)堆内存(Heap Memory)
存储位置JVM 之外,操作系统内存JVM 内部,由 GC 管理
访问速度快,直接与 OS 交互较慢,需要数据拷贝
GC 管理不受 GC 影响,需手动释放受 GC 影响,自动管理
I/O 操作适合高频 I/O 操作适合普通对象存储
适用场景NIO、Netty、数据库驱动普通 Java 对象管理

5. 总结

  1. 直接内存JVM 之外的内存区域,适用于高性能 I/O 操作(如 Netty、NIO)。
  2. 它不会受到 GC 影响,但需要手动释放,否则可能导致 OOM。
  3. JVM 参数 -XX:MaxDirectMemorySize 控制直接内存上限,默认值与堆大小一致。
  4. 适用于 I/O 密集型场景,如网络通信(Netty)、数据库驱动、文件操作等

如果你的系统需要高性能 I/O,可以考虑使用直接内存优化性能


http://www.ppmy.cn/embedded/161322.html

相关文章

DeepSeek发布自己的AI图像生成器Janus-Pro

DeepSeek 表示,Janus-Pro 7B 在多个基准测试中的表现优于 OpenAI 的 Dall-E 3 和 Stable Diffusion。但它真的那么好吗?它是否名副其实,还是这只是另一个利用人工智能炒作的模型? DeepSeek 现已推出Janus-Pro ,这是其…

基于uniapp vue3 的滑动抢单组件

通过在onMounted获取movable-area与movable-view实例&#xff0c;计算出可滑动的距离 效果图&#xff1a; 代码&#xff1a; <template><view class"slider-container"><movable-area class"movable-area" id"movableArea">…

Axios 拦截器实现的原理

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

智慧机房解决方案(文末联系,领取整套资料,可做论文)

智慧机房解决方案-软件部分 一、方案概述 本智慧机房解决方案旨在通过硬件设备与软件系统的深度整合&#xff0c;实现机房的智能化管理与服务&#xff0c;提升机房管理人员的工作效率&#xff0c;优化机房运营效率&#xff0c;确保机房设备的安全稳定运行。软件部分包括机房管…

scRNA-seq scanpy教程1:准备工作+AnnData数据结构理解

此处使用python版本的scRNA-seq处理工具scanpy&#xff0c;而不是R版本的seurat&#xff0c;因为seurat包安装繁杂 一&#xff0c;准备工作 1&#xff0c;python库的安装&#xff1a; 新建1个环境sc-python mamba create -n sc-python -c conda-forge -y scanpy python-igra…

【DeepSeek-01】无需 Docker,千元级电脑本地部署 Ollama + DeepSeek-R1:14b + Chatbox

文章目录 DeepSeek-01&#xff1a;无需 Docker&#xff0c;千元级电脑本地部署 Ollama DeepSeek-R1:14b Chatbox本机环境Ollama 安装步骤1. 下载 Ollama2. 安装3. 初始化配置4. 启动 Ollama 服务 DeepSeek-R1:14b 安装步骤1. 下载deepseek r1 14b模型2. 安装依赖项3. 下载模型…

深入探索人工智能的未来:DeepSeek R1与蓝耘智算平台的完美结合

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;正以前所未有的速度改变着我们的生活和工作方式。从智能语音助手到自动驾驶汽车&#xff0c;从精准医疗到金融风险预测&#xff0c;AI的应用无处不在。深度学习作为AI的核…

单片机之基本元器件的工作原理

一、二极管 二极管的工作原理 二极管是一种由P型半导体和N型半导体结合形成的PN结器件&#xff0c;具有单向导电性。 1. PN结形成 P型半导体&#xff1a;掺入三价元素&#xff0c;形成空穴作为多数载流子。N型半导体&#xff1a;掺入五价元素&#xff0c;形成自由电子作为多…