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

什么是Java中的直接内存管理_ByteBuffer.allocateDirect内存回收逻辑

千涛姑娘_2174

千涛姑娘_2174

发布时间:2026-02-23 15:42:10

|

865人浏览过

|

来源于php中文网

原创

DirectByteBuffer 的内存由操作系统管理,JVM 仅通过 Cleaner 异步回收,不保证及时性;频繁分配易致 OOM,应复用、池化并避免依赖自动清理。

什么是java中的直接内存管理_bytebuffer.allocatedirect内存回收逻辑

DirectByteBuffer 的内存到底归谁管

Java 的 ByteBuffer.allocateDirect 分配的不是堆内存,而是操作系统原生内存(通常通过 malloc 或 mmap),JVM 不直接管理它的生命周期——它靠一个隐藏的 Cleaner 关联到虚引用(PhantomReference)来触发回收。这意味着:**你不能靠 GC 时机预测它何时释放,也不能靠 System.gc() 强制回收**。

  • 分配时 JVM 会记录已用直接内存大小(受 -XX:MaxDirectMemorySize 限制,不设则默认等于 -Xmx)
  • 当分配失败抛出 OutOfMemoryError: Direct buffer memory,往往不是因为没空闲内存,而是因为 Cleaner 还没运行、旧缓冲区还没释放
  • 频繁创建/丢弃 DirectByteBuffer 容易堆积未清理对象,尤其在 GC 压力小(如老年代长期不触发 Full GC)时更明显

为什么调用 cleaner.clean() 也不一定立刻释放

即使你手动触发 sun.misc.Cleaner(比如反射拿到并调用),也只是把释放逻辑提交进一个单线程的 Cleaner 队列,实际释放由后台线程执行——这个线程可能被阻塞、调度延迟,甚至在某些 JDK 版本中因线程优先级低而“饿死”。

  • JDK 9+ 中 Cleaner 已迁移到 java.lang.ref.Cleaner,但行为类似:异步、无保证顺序、不保证及时性
  • Unsafe.freeMemory() 是最终释放系统内存的调用,但它只在 Cleaner 线程里执行,无法从应用线程同步等待
  • 别试图用 ByteBuffer.clear() 或 compact() 来“释放”直接内存——它们只重置 position/limit,对底层内存毫无影响

怎么避免 OOM 和内存泄漏

核心思路是:**少分配、复用、早显式清理(如果真有必要)**。不要依赖自动回收扛住高吞吐场景。

  • 用池化方案:Apache Commons Pool 或 Netty 的 PooledByteBufAllocator,复用 DirectByteBuffer 实例
  • 确认是否真需要 direct:纯内存拷贝、零拷贝网络发送(如 SocketChannel.write(ByteBuffer))才值得;否则堆内 ByteBuffer 更稳
  • 监控关键指标:JVM 启动加 -XX:+PrintGCDetails,观察日志中 Direct buffer memory 行;或用 JMX 查 java.nio:type=BufferPool,name=direct 的 MemoryUsed
  • 极端情况可强制触发 Cleaner:调用 System.gc() + 短暂 Thread.sleep(10)(不推荐生产,仅调试),但别写进业务逻辑

JDK 21+ 的变化和现实约束

JDK 21 引入了 ScopedMemoryAccess 和 MemorySegment(属于 Panama 项目),目标是替代 DirectByteBuffer 的手动管理,但目前 ByteBuffer API 仍完全兼容旧逻辑,所有已有代码行为不变。

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

  • 新 API 仍处于 incubating 阶段(--enable-preview),生产环境慎用
  • 即便未来全面迁移,底层仍是 mmap/malloc + Cleaner 模式,只是封装更安全——不会改变“非即时释放”这一根本约束
  • 真正难处理的从来不是“怎么释放”,而是“什么时候该认为它已释放”:操作系统 free 后,内存页未必立刻归还给系统,top 或 ps 看到的 RSS 可能滞后数秒甚至更久

热门AI工具

更多
咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

UpDream
UpDream Hot

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

豆包大模型

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

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

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

DeepSeek

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

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 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

452

2026.04.29

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

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

6087

2023.07.18

堆和栈区别
堆和栈区别

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

2588

2023.08.10

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

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

4358

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

543

2025.12.01

CSS position定位有几种方式
CSS position定位有几种方式

有4种,分别是静态定位、相对定位、绝对定位和固定定位。更多关于CSS position定位有几种方式的内容,可以访问下面的文章。

352

2023.11.23

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

20

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

20

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

20

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

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

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