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

6. JVM直接内存

1. 什么是直接内存 

直接内存是 Java 中一种特殊的内存分配方式,它允许Java程序直接访问操作系统的本地内存,绕过Java堆内存的管理机制。

这种内存不属于Java虚拟机(JVM)运行时数据区的一部分,而是在JVM之外由操作系统管理的内存区域。

主要特点

  1. 绕过JVM堆内存:直接内存分配不受Java堆大小限制(-Xmx参数)

  2. 本地IO操作高效(常用于NIO操作):减少了数据在Java堆和本地堆之间的复制

  3. 分配成本较高:创建和销毁的开销比堆内存大

  4. 手动管理:需要显式释放,不像堆内存由GC自动回收

应用场景:

  • 需要频繁进行IO操作的场景(如NIO网络编程)  
  • 需要处理大容量数据且希望减少GC影响的场景  
  • 需要与本地代码交互的场景

2. JVM堆内存与直接内存的区别

2.1 IO 与 NIO 的区别

常规 IO 的拷贝流程:

NIO 的拷贝流程:

2.2 内存的本质区别

JVM的内存结构

  • 堆内存(Heap Memory):由JVM管理,存放Java对象(受-Xmx等参数限制)。

  • 非堆内存(Non-Heap Memory):包括方法区(Metaspace)、JIT代码缓存等,也由JVM管理。

  • 直接内存(Direct Memory)不在JVM运行时数据区内,而是通过JVM代码(如ByteBuffer.allocateDirect())向操作系统申请的本机内存

直接内存的来源

  • 直接内存是通过JVM进程向操作系统申请的本机内存(Native Memory),属于你的电脑物理内存(或OS虚拟内存)的一部分

  • 例如,在Linux下,JVM调用malloc()mmap()申请内存;在Windows下可能调用VirtualAlloc()

为什么叫"直接"内存?

  • 因为这块内存可以直接被Java的NIO Buffer(如DirectByteBuffer)访问,而不需要经过JVM堆内存的拷贝

  • 例如,读取文件时,数据可以直接从OS缓存写入直接内存,再被Java访问,避免了堆内外的数据复制

总结 

内存类型管理方存储位置是否受GC管理
JVM堆内存JVMJVM进程内是(GC回收)
直接内存用户代码(通过JNI)本机内存(物理/虚拟)否(需手动或Cleaner回收)

上一篇   下一篇

http://www.xdnf.cn/news/15172.html

相关文章:

  • 机器学习(ML)、深度学习(DL)、强化学习(RL)关系和区别
  • Linux之如何用contOs 7 发送邮件
  • LeetCode 3169.无需开会的工作日:排序+一次遍历——不需要正难则反,因为正着根本不难
  • 【Modern C++ Part9】Prefer-alias-declarations-to-typedefs
  • 【PTA数据结构 | C语言版】出栈序列的合法性
  • 使用FastAdmin框架开发二
  • Python 实战:构建 Git 自动化助手
  • 昇腾FAQ-A06-行业应用MindX相关
  • hiredis: 一个轻量级、高性能的 C 语言 Redis 客户端库
  • 【世纪龙科技】新能源汽车结构原理体感教学软件-比亚迪E5
  • 代码训练LeetCode(45)旋转图像
  • 知识蒸馏中的教师模型置信度校准:提升知识传递质量的关键路径
  • git版本发布
  • 企业选择大带宽服务器租用的原因有哪些?
  • 电商广告市场惊现“合规黑洞”,企业如何避免亿元罚单
  • Python后端项目之:我为什么使用pdm+uv
  • Java文件传输要点
  • QT跨平台应用程序开发框架(6)—— 常用显示类控件
  • 关于wpf的自适应
  • Elasticsearch 线程池
  • 【八股消消乐】Kafka集群 full GC 解决方案
  • 数据湖和数据库对比
  • Linux->基础IO
  • DVWA靶场通关笔记-反射型XSS(Reflected High级别)
  • 亚矩阵云手机:重构物流供应链,让跨境包裹“飞”得更快更准
  • (C++)STL标准库(vector动态数组)(list列表)(set集合)(map键值对)相关对比,基础教程
  • Linux中Gitee的使用
  • 杭州乐湾科技有限公司的背景、产品体系与技术能力的全方位深度分析
  • 三维点云Transformer局部感受野构建:理论、方法与挑战
  • C++类模版1