当前位置: 首页 > news >正文

JVM如何管理直接内存?

⚙️ 一、直接内存的分配

  1. 通过Unsafe类分配
    • 直接内存的分配由java.nio.ByteBuffer.allocateDirect()触发,内部调用Unsafe.allocateMemory(size)向操作系统申请堆外内存,返回内存地址。
    • 分配时通过Bits.reserveMemory()检查是否超出-XX:MaxDirectMemorySize限制(默认与堆最大值-Xmx相同),若超出则抛出OutOfMemoryError
  2. 创建DirectByteBuffer对象
    • 堆外内存地址被封装到堆内的DirectByteBuffer对象中,同时注册Cleaner(虚引用)用于后续回收。

🔄 二、直接内存的回收机制

  1. 自动回收流程
    • 步骤1:当DirectByteBuffer对象不再被引用时,JVM垃圾回收器(GC)通过可达性分析判定其不可达,触发对象回收。
    • 步骤2:对象回收时,关联的Cleaner(虚引用)被加入引用队列(Reference Queue)。
    • 步骤3:后台线程ReferenceHandler(最高优先级守护线程)持续轮询引用队列,调用Cleaner.clean()方法。
    • 步骤4:Cleaner触发Deallocator.run(),调用Unsafe.freeMemory(address)释放堆外内存。
  2. 手动回收建议
    • 若需立即释放,可显式调用((DirectBuffer) buffer).cleaner().clean()
    • 调用System.gc()可能触发Full GC,但不推荐(可能导致STW延迟),尤其在禁用-XX:+DisableExplicitGC时无效。

⚠️ 三、关键风险与管理策略

  1. 内存泄漏风险
    • 原因:若DirectByteBuffer对象未被及时回收(如长期存活或循环引用),或禁用System.gc(),可能导致Cleaner无法触发,直接内存无法释放。
    • 排查工具:
      • jcmd VM.native_memory:查看堆外内存使用概况。
      • Arthas memory命令:监控直接内存池状态。
  2. 参数调优
    • 设置上限:-XX:MaxDirectMemorySize=512m避免超出物理内存。
    • 避免禁用显式GC:除非高并发场景需减少Full GC,否则保留-XX:-DisableExplicitGC以支持自动回收。
  3. 替代方案
    • 内存池复用:使用ByteBuffer池(如Netty的ByteBuf)减少频繁分配开销。
    • 软引用缓存:对非关键直接内存使用SoftReference,内存不足时自动回收。

💎 四、总结:直接内存管理核心流程

分配:Unsafe.allocateMemory() → 创建DirectByteBuffer + 注册Cleaner(虚引用)
回收:GC回收对象 → Cleaner入队 → ReferenceHandler触发Cleaner.clean() → Unsafe.freeMemory()
  • 关键依赖:虚引用 + ReferenceHandler线程 + Unsafe原生操作。
  • 最佳实践:
    • 高频I/O场景使用直接内存,但需监控MaxDirectMemorySize
    • 避免长期持有DirectByteBuffer引用,防止内存泄漏。
http://www.dtcms.com/a/423093.html

相关文章:

  • 【完整源码+数据集+部署教程】医疗设备显示器图像分割系统: yolov8-seg-C2f-SCConv
  • PyCharm项目依赖库的备份与还原方法
  • OpenSSL 3.0对某些加密算法增加了限制
  • git fatal:Server aborted the SSL handshake
  • 深入理解 Python `ssl` 库:安全通信的基石
  • 江门网页建站模板临沂网站建设费用
  • 网站手机模板和pc模板要分开做网站首页需求
  • 国内 huggingfaces 仓下载
  • 基因组学发展史
  • 论文阅读(第4章,page55)
  • java设计模式:适配器模式
  • 做微商网站制作迪虎科技网站建设
  • Cobalt Strike 学习笔记(1)
  • 学习React-20-useId
  • 掌中智汇,运筹帷幄 - 全新ASUS华硕智汇商擎小程序上线
  • 如何查询网站开发奔牛网络推广
  • 企业网站开发的功能百度seo优
  • 设计模式(C++)详解——备忘录模式(2)
  • 学习:uniapp全栈微信小程序vue3后台(30)
  • centos建设网站推广软文怎么写
  • 【开题答辩全过程】以 mac官网商城为例,包含答辩的问题和答案
  • mac基于mlx运行轻量级模型gemma-3-270m
  • 工业显示器在焊接机器人中的应用
  • uniapp 日历组件 uni-datetime-picker
  • 如何上传网站内容wordpress 文章导出
  • 【2小时轻松部署分布式存储Ceph高可用集群】2-ceph组件-Ceph 组件深度拆解:从底层架构到实战运维的全维度指南
  • 外链都没有的网站如何做排名的摄影设计说明范文
  • STM32H743-ARM例程13-SDIO
  • 求职招聘小程序:轻量化场景下的核心功能解析
  • 玳瑁的嵌入式日记---0929(ARM--ADC)