news 2026/4/18 9:21:24

分配与回收原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
分配与回收原理

直接内存的分配与回收核心是 “Native 层分配内存 + Java 层持有引用 + Cleaner 机制回收”,全程需 JVM 与操作系统协同,具体原理如下:

一、直接内存的分配原理

1. 分配触发入口
  • 核心途径:通过ByteBuffer.allocateDirect(int capacity)(JDK 推荐)或Unsafe.allocateMemory(long size)(底层 Native 调用)触发分配。
  • 关键前提:分配前会检查直接内存已用容量是否超过-XX:MaxDirectMemorySize限制,若超过直接抛出OutOfMemoryError: Direct buffer memory
2. 分配核心流程
  1. 调用 Native 方法(如Unsafe.allocateMemory),向操作系统申请 “堆外内存”(直接内存)。
  2. 操作系统在本地内存中划分一块连续空间,返回该空间的起始地址(Native 地址)。
  3. 在 Java 堆中创建DirectByteBuffer对象,该对象仅存储 “Native 地址、内存容量、读写指针” 等元数据,不存储实际数据。
  4. DirectByteBuffer关联Cleaner对象(虚引用),绑定释放直接内存的回调逻辑(Deallocator),为后续回收做准备。
  5. 返回DirectByteBuffer对象给应用程序,程序通过该对象的 API(如get()put())间接操作 Native 层的直接内存。
3. 分配关键细节
  • 分配成本:高于堆内存,需跨 JVM 与操作系统调用,且直接内存的物理空间分配由操作系统管理(如内存对齐、空间分配策略)。
  • 无冗余开销:直接内存是原生内存块,无 Java 对象头、对齐填充等堆内存特有的冗余消耗。

二、直接内存的回收原理(与前文释放流程呼应,聚焦 “原理本质”)

1. 回收的核心依赖
  • 核心机制:Cleaner虚引用 + JVM 垃圾回收,无需手动干预(Unsafe手动分配除外)。
  • 关键对象:Cleaner持有DirectByteBuffer的虚引用和Deallocator释放器,虚引用不影响DirectByteBuffer的 GC 回收。
2. 回收核心流程
  1. 应用层释放DirectByteBuffer的所有强引用(如置为null、超出作用域),使其成为 GC 不可达对象。
  2. JVM 执行 GC 时,标记DirectByteBuffer为可回收对象,同时将关联的Cleaner加入引用队列(ReferenceQueue)。
  3. JVM 后台线程ReferenceHandler扫描引用队列,发现Cleaner后调用其clean()方法。
  4. clean()方法触发Deallocatorrun()方法,通过Unsafe.freeMemory(Native地址)调用 Native 函数。
  5. 操作系统回收对应的直接内存空间,GC 后续将DirectByteBuffer从 Java 堆中彻底回收。
3. 回收关键细节
  • 回收时机:依赖 GC 触发,若 GC 迟迟不执行,即使DirectByteBuffer不可达,直接内存也不会立即释放。
  • 手动分配特例:若通过Unsafe.allocateMemory直接分配,无Cleaner关联,必须手动调用Unsafe.freeMemory释放,否则导致内存泄漏。

三、分配与回收的核心对比

环节核心操作依赖组件关键约束
分配操作系统划分配外内存,Java 堆创建引用对象UnsafeDirectByteBufferMaxDirectMemorySize和系统总内存限制
回收触发 Native 释放函数,回收堆外内存Cleaner、GC、ReferenceHandler依赖DirectByteBuff
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 20:17:22

hbuilderx制作网页实现学生管理系统前端界面

用 HBuilderX 快速搭建学生管理系统前端:从零开始的实战指南 你有没有过这样的经历?老师布置了一个“学生管理系统”的课程设计,要求做出界面、能增删改查,但你连从哪下手都不知道?别慌——今天我们就用 HBuilderX 这…

作者头像 李华
网站建设 2026/4/16 16:04:27

ComfyUI-Manager模型路径格式不一致问题分析与解决方案

ComfyUI-Manager模型路径格式不一致问题分析与解决方案 【免费下载链接】ComfyUI-Manager 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Manager 问题背景 在使用ComfyUI-Manager管理工具下载UNet/扩散模型时,用户可能会遇到一个典型的路径格式不…

作者头像 李华
网站建设 2026/4/18 0:29:19

ComfyUI插件管理终极指南:让AI创作效率翻倍的5个秘诀

还在为ComfyUI插件安装繁琐、依赖冲突而烦恼吗?想要一键管理所有自定义节点,让AI绘图工作流更加顺畅高效?今天分享的ComfyUI插件管理指南,将彻底改变你的创作体验! 【免费下载链接】ComfyUI-Manager 项目地址: http…

作者头像 李华
网站建设 2026/4/18 8:27:13

JLink驱动开发图解说明:官网下载步骤

从零开始搭建稳定调试环境:J-Link 驱动官方下载与配置实战指南 你有没有遇到过这样的场景? 新项目刚上电,J-Link 插上去死活识别不了;Keil 点下载报错 -5: Target not connected ;明明昨天还能用的环境&#xff0c…

作者头像 李华
网站建设 2026/4/18 8:44:00

小米运动刷步数终极方案:2025智能同步微信支付宝全攻略

还在为运动步数不够而烦恼吗?mimotion项目为你带来革命性的小米运动自动刷步数解决方案,支持邮箱登录并智能同步微信支付宝数据,让你轻松拥有令人羡慕的运动成就。 【免费下载链接】mimotion 小米运动刷步数(微信支付宝&#xff0…

作者头像 李华
网站建设 2026/4/17 14:10:24

探秘Java不规则数组:灵活的多维数据存储方案

在Java编程中,数组是存储同类型数据的基础结构,而不规则数组(又称锯齿数组)是多维数组的一种特殊形式,它打破了常规二维数组“行等列宽”的结构限制,各行的元素个数可以互不相同,适配更多变的数…

作者头像 李华