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

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.dtcms.com/a/276068.html

相关文章:

  • 菜鸟的C#学习(二)
  • 动手开发 MCP Server (Datawhale AI夏令营)
  • TensorBoard
  • 全栈开发知识
  • 计算机毕业设计springboot阳阳助农电商平台 基于Spring Boot的阳阳助农电商平台设计与开发 Spring Boot框架下的阳阳助农电商平台构建
  • 苦练Python第7天:布尔七日斩
  • 模拟电路--供复习和嵌入式学习
  • 威联通docker容器安装宝塔面板
  • VUE3 el-table 主子表 显示
  • ICCV2025 特征点检测 图像匹配 RIPE
  • 【Elasticsearch 】search_throttled
  • Spark计算性能优化实战指南
  • 面试现场:奇哥扮猪吃老虎,RocketMQ高级原理吊打面试官
  • 一文理解锂电池充电、过放修复与电量测量:从原理到实战
  • Redis Cluster 手动部署(小白的“升级打怪”成长之路)
  • 工业软件出海的ERP-PLM-MES一体化解决方案
  • MCP实验
  • Java 大视界 -- Java 大数据机器学习模型在电商用户复购行为预测与客户关系维护中的应用(343)
  • LangChain 内存(Memory)
  • 小白入门:通过手搓神经网络理解深度学习
  • CCS-MSPM0G3507-4-串口通讯-实现收和发
  • Linux之如何用contOs 7 发送邮件
  • Gitee Push 失败 7 日谈:每天一个踩坑故事
  • (神作必看)深入剖析C++前缀和:原理、应用与高效学习实践
  • python的婚纱影楼管理系统
  • os.type详解
  • 初识JDBC
  • springboot面点连锁店管理系统-计算机毕业设计源码05135
  • 掌握现代CSS:变量、变形函数与动态计算
  • 【FPGA】LUT如何实现组合逻辑、时序逻辑