杭州营销型网站建设西安专业网站建设

广州和恒电子商务有限公司 2026/09/09 19:17:39

直接内存的分配与回收核心是 “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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

咸阳网站建设资阳网站建设

用树莓派动手实践CoAP协议:从温湿度采集到轻量通信的完整实战你有没有试过在树莓派上跑一个HTTP服务器,结果发现光是启动Flask都卡得不行?更别说还要把传

2026/06/30 13:53:07

电器网站建设机票网站建设

Mac的权限是非常严密的,一旦没有数字签名,系统就会直接拒绝运行,但是有一种方法可以再次运行,在设置->隐私和安全性->最下面会出现

2026/06/30 13:59:08

娄底网站建设小企业网站建设

第一章:Open-AutoGLM跑不动?问题根源往往在硬件层运行 Open-AutoGLM 时频繁卡顿甚至无法启动,多数开发者第一时间排查代码或依赖配置&#x

2026/06/30 10:29:20

英文网站建设网站建设的

如何彻底解决Xbox手柄在macOS上的兼容性问题:完整操作指南【免费下载链接】360Controller项目地址: https://gitcode.com/gh_mirrors/36/

2026/06/30 11:27:55

西安网站建设公司莱芜网站建设

Beyond Compare 4 对比模型输出差异?高级用法揭秘在大模型开发日益工程化的今天,一个看似简单却常被忽视的问题浮出水面:我们如何确信,

2026/06/30 13:47:37

天津网站建设商业网站建设

AcFun视频下载完整攻略:5分钟掌握离线收藏A站内容的最佳方法【免费下载链接】AcFunDown包含PC端UI界面的A站 视频下载器。支持收藏夹、UP主视频批量下载 😳

2026/06/30 13:52:08

西安网站建设网站建设一条龙

XML与SOAP技术深度解析在当今的软件开发领域,XML(可扩展标记语言)和SOAP(简单对象访问协议)扮演着至关重要的角色。它们不仅为数据的存储、传输和交换提供了强大的支持,还使得跨平台应用开发成为

2026/06/30 12:05:59

深圳网站建设公司邢台网站建设

N-BEATS模型:TensorFlow时间序列基准在零售库存告急、电力负荷突增或云服务流量飙升的瞬间,精准预测未来几小时甚至几天的趋势,往往决定了企业能否从

2026/06/30 13:33:36

洛阳网站建设学网站建设

第一章:Open-AutoGLM 运动数据记录Open-AutoGLM 是一个开源的自动化运动数据采集与分析框架,专为智能穿戴设备和移动健康应用设计。它支持多种传感器数据的

2026/06/30 12:19:30

免费网站建设惠州网站建设

一、HLS编译IR中间表示(Intermediate Representation, IR)是编译器在将源代码转换为目标代码过程中使用的一种中间形式的程序表示;hls co

2026/06/30 13:30:06