讲师中心 微信公众号
AI工具推荐 视频效率加速

Java里Direct Memory如何管理_Java直接内存分配与回收机制说明

千宇吖_5112

千宇吖_5112

发布时间:2025-12-14 17:26:02

|

214人浏览过

|

来源于php中文网

原创

Direct Memory由操作系统分配且不受JVM堆GC直接管理,通过ByteBuffer.allocateDirect()调用Unsafe.allocateMemory()实现,受-XX:MaxDirectMemorySize限制;回收依赖Cleaner(虚引用+ReferenceQueue)在GC后异步触发Unsafe.freeMemory()。

java里direct memory如何管理_java直接内存分配与回收机制说明

Java里的Direct Memory(直接内存)不由JVM堆管理,而是通过java.nio.ByteBuffer.allocateDirect()在堆外分配,由操作系统负责物理内存映射。它的生命周期不直接受GC控制,但JVM通过Cleaner机制间接管理释放——本质上是利用虚引用+ReferenceQueue实现的延迟清理。

直接内存如何分配

调用ByteBuffer.allocateDirect(size)时,JVM底层通过Unsafe.allocateMemory()向操作系统申请内存(Linux下通常是mmap(MAP_ANONYMOUS)),跳过JVM堆。这部分内存不受-Xmx限制,但受系统资源和-XX:MaxDirectMemorySize约束(默认等于-Xmx)。超出限制会抛OutOfMemoryError: Direct buffer memory。

  • 分配过程不触发GC,但会检查Direct内存使用量是否超限
  • 每次分配都会更新全局计数器Bits.reservedMemory,用于限流判断
  • 底层返回的是一个long型地址(address),JVM用它构造DirectByteBuffer对象并维护其内存视图

Direct Memory如何回收

DirectByteBuffer对象本身在堆中,会被常规GC回收;真正释放堆外内存,依赖其内部关联的Cleaner。这个Cleaner继承自虚引用(PhantomReference),注册到ReferenceQueue中。当GC发现DirectByteBuffer不可达时,会把对应Cleaner加入队列,随后由Reference Handler线程调用其clean()方法,最终执行Unsafe.freeMemory(address)。

Java注释规范Skills
Java注释规范Skills

当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。

下载
  • 回收不是即时的:取决于GC时机、Reference Handler线程调度,可能有延迟
  • 如果DirectByteBuffer长期被强引用(如缓存未及时clear),堆外内存无法释放,易导致OOM
  • 可手动调用buffer.cleaner().clean()强制触发(不推荐,存在竞态且非public API)

常见问题与规避建议

生产环境中Direct Memory泄漏往往表现为堆内存充足但频繁报Direct buffer OOM,或top显示进程RSS持续上涨。根本原因多为DirectByteBuffer未及时脱离作用域,或被意外持有(如Netty的PooledByteBuf未释放、线程局部缓存未清理)。

立即学习“Java免费学习笔记(深入)”;

  • 避免长期持有DirectByteBuffer,尤其在线程池或静态容器中
  • 使用Netty等框架时,严格遵循release()规范;自定义NIO代码务必显式调用buffer.clear()或置null
  • 监控可用加JVM参数:-XX:+PrintGCDetails -XX:+PrintReferenceGC,观察Cleaner处理情况
  • 必要时设置合理上限:-XX:MaxDirectMemorySize=2g,防止无节制占用

基本上就这些。Direct Memory不是“不用管”的内存,而是换了一种方式管理——靠GC间接驱动、靠Cleaner兜底释放。理解它,才能避开堆外内存的坑。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
Java I/O 与 NIO 编程体系合集
Java I/O 与 NIO 编程体系合集

全面讲解 Java I/O 编程的演进与核心 API,涵盖传统 I/O 的字节流(InputStream/OutputStream)与字符流(Reader/Writer)体系、装饰器模式在 I/O 中的应用(BufferedReader/InputStreamReader)、文件读写与目录操作、NIO 核心三要素(Buffer 缓冲区/Channel 通道/Selector 选择器)、ByteBuffer 操作与内存映射文件(Mappe

472

2026.04.29

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6267

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2628

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4458

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

4290

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

3613

2023.06.29

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn