news 2026/7/6 3:32:14

JVM 的直接内存(Direct Memory)是什么?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JVM 的直接内存(Direct Memory)是什么?

先打个比方

想象你住在小区 A,朋友住在小区 B,你要给他送一份文件。

普通方式(堆内存):

你把文件交给小区快递站 → 快递站发快递 → 文件送到朋友手上

你要给他送东西,得先交给快递站,快递站再转给朋友。快递站就是"中转站",多了一步。

直接内存方式:

你俩后来住进了同一个小区,文件直接递过去就行

东西直接递过去就行,不用走快递站,中间省了一步

直接内存就是 JVM绕过堆内存,直接向操作系统申请的一块内存区域,让 JVM 和操作系统共用同一块地盘


具体发生了什么

没有直接内存时

磁盘/网卡 → 操作系统内核缓冲区 → 【复制一份】→ JVM 堆内存 byte[] → Java 程序读取 ↑ ↑ 系统管的区域 Java 管的区域

每次做 I/O 操作(读文件、收网络数据),数据从磁盘出来后要先存在系统内核缓冲区,然后再复制一份到 JVM 堆内存的 byte[] 里,你的 Java 程序才能用。

同一份数据存了两份,复制这一步既浪费时间,又浪费内存。

有了直接内存后

磁盘/网卡 → 直接内存 → Java 程序读取 ↑ ↑ 系统能访问 JVM也能访问 同一块内存,不用复制

数据从磁盘出来后,直接进入一块两边都能访问的内存区域。Java 堆里的 byte[] 缓冲区不再需要,中间那次复制被彻底干掉了。


代码怎么用

Java NIO 提供了ByteBuffer,就一个方法的区别:

// 普通的堆内存缓冲区 ByteBuffer heapBuffer = ByteBuffer.allocate(1024); ​ // 直接内存缓冲区 —— 关键就在这里 ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024);

allocateDirect()就是向操作系统申请直接内存。用起来 API 一模一样,区别全在底层。

一个实际例子——文件零拷贝:

FileChannel in = FileChannel.open(Paths.get("大文件.dat")); FileChannel out = FileChannel.open(Paths.get("副本.dat")); ​ // 底层就是直接内存,没有经过 Java 堆 in.transferTo(0, in.size(), out);

你没手动分配 ByteBuffer,但transferTo内部就是靠直接内存实现的。很多你天天用的 API 底层都是这套机制。


堆内存 vs 直接内存,一张表看清

对比项堆内存直接内存
分配位置JVM 堆内堆外,操作系统管理
分配速度相对慢(要跟操作系统打交道)
读写速度慢(需要额外复制到系统缓冲区)快(直接访问,不需要复制)
GC 管理自动回收不归 GC 管,需要自己管理
适合场景普通 Java 对象大量 I/O 操作(网络、文件)

核心优势:少了一次内存复制,频繁 I/O 场景下性能提升明显。


三个坑,用之前得知道

坑一:分配慢

堆上 new 一个数组很快,但allocateDirect每次都要跟操作系统申请,开销不小。不是 I/O 密集的场景,没必要用。

坑二:不归 GC 管

GC 不会主动回收直接内存。短时间内分配了大量直接内存又不用,可能会报:

java.lang.OutOfMemoryError: Direct buffer memory

建议启动时显式设置上限:

-XX:MaxDirectMemorySize=256m

坑三:出了问题难查

直接内存不在堆里,jmapjstat这些工具看不到它的全貌,排查成本比堆内存高不少。


谁在用

  • Netty(网络框架)—— ByteBuf 默认用直接内存,这是它高性能的核心原因之一

  • NIO FileChannel——FileChannel.map()返回的就是直接内存

  • Hadoop / Spark—— 大块缓冲区放堆外,减轻 GC 压力

  • 各种 RPC 框架—— 涉及大量网络 I/O 的基本都在用

不是偏门知识,是 Java 高性能 I/O 的基础设施。


一句话总结

直接内存 = JVM 向操作系统借一块内存(JVM 和操作系统共用同一块地盘),跳过中间的复制环节,让 I/O 更快。代价是分配慢、不归 GC 管、排查困难。高频 I/O 场景值得用

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 3:29:52

NSK微型精密滚珠丝杠W0801MA技术指南

为您详细整理 NSK W0801MA-12Y-C3T2 滚珠丝杠的完整参数规格、技术特点及产品应用。 该型号属于 NSK 的 MA 型(精密级标准库存品轴端完成品),采用内循环方式。它满足 C3 级超高精密定位标准,与带有过盈滚珠预紧的型号(…

作者头像 李华
网站建设 2026/7/6 3:29:12

如何在Windows上安装APK文件:APK安装器终极指南

如何在Windows上安装APK文件:APK安装器终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上直接运行安卓应用,…

作者头像 李华
网站建设 2026/7/6 3:26:59

GPT内容创作指南:写文章、列提纲与生成标题

GPT内容创作指南:写文章、列提纲与生成标题 摘要: 很多创作者把GPT当成“自动完稿机”,输入主题期待完整文章,结果往往泛泛而谈或结构松散。本文从实际创作痛点出发,分享一套可复用的三环节工作流——列骨架、逐章写、…

作者头像 李华
网站建设 2026/7/6 3:24:57

深入解析 mini-swe-agent:极简架构下的强大AI软件工程代理

mini-swe-agent 这个项目是 SWE-agent 团队推出的一个极简但功能强大的 AI 软件工程代理(Agent)。它旨在用极简的代码实现核心的智能体循环,同时保持强大的代码修复能力。 一、核心实现架构与技术细节 mini-swe-agent 的实现非常精炼&#xf…

作者头像 李华