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

堆内存、本地内存、堆外内存、直接内存的区别

堆内存、本地内存、堆外内存、直接内存的区别

  1. 堆内存(Heap memory):堆内存是 JVM 进程内的内存,用于存储 Java 对象,并由 JVM 的垃圾回收器管理。
  2. 本地内存/堆外内存(Native memory/Off-heap):这是在进程地址空间中分配的内存,但不在堆内存范围内,因此不会被 Java 垃圾回收器释放。
  3. 直接内存(Direct memory):直接内存与本地内存类似,但它还意味着底层硬件中的缓冲区正在被共享。例如,网络适配器或图形显示中的缓冲区。这里的目的是减少相同字节在内存中被复制的次数。

区分堆内存、非堆内存的核心区别就是是否受jvm垃圾收集器管理

堆外内存和本地内存的联系和区别:
联系:

  • 堆外内存实际上是本地内存的一部分,主要用于存储那些不需要被垃圾回收的对象或数据。
  • 它们都位于 JVM 堆之外,不受垃圾回收器管理。

区别:

  • 堆外内存更侧重于应用程序显式分配和使用的内存区域,通常是为了提高性能或减少垃圾回收的影响。
  • 本地内存是一个更广泛的概念,涵盖了 JVM 进程中所有非堆内存区域,包括 JVM 自身使用的内存和其他本地资源。

你可以认为堆外内存是本地内存的一个子集,专门用于应用程序显式管理和使用的内存区域。
在实际开发中,当你提到“堆外内存”时,通常指的是你通过编程手段(如 Direct ByteBuffer 或其他方式)显式分配的内存;而“本地内存”则可能包含更多 JVM 自身使用的内存区域。
因此,在大多数情况下,堆外内存和本地内存可以视为相同的概念,但在具体场景下,它们的侧重点有所不同。

在这里插入图片描述

  • 代码缓存Code Cache,既不在堆中,也不在元空间中,是一个单独的堆外区域。
  • 如果启用了 类指针压缩 UseCompressedClassPointers,那么类及其元数据会使用两块独立的本地内存区域。在 UseCompressedClassPointers 模式下,64 位的类指针会被表示为 32 位值,这些压缩后的类指针存储在压缩类空间 (Compressed Class Space) 中。默认情况下,这个压缩类空间大小为 1GB,并且可以通过参数 CompressedClassSpaceSize 进行配置。

    MaxMetaspaceSize 设置了这两块区域(压缩类空间的已提交空间和类元数据空间)的总提交大小的上限。

    以下是启用 UseCompressedClassPointers 后 GC 日志中的示例输出。Metaspace 报告的已提交和已保留空间中,包含了压缩类空间的已提交和已保留空间。
    在这里插入图片描述

Refer:
堆内存、本地内存、堆外内存、直接内存的区别

相关文章:

  • 1306_10-习题1_6_10-课后习题-高等数学
  • vllm 部署 Qwen2.5-VL-7B-Instruct 识别程序(docker版)
  • 学习笔记—C++—类和对象(2)
  • 优质LLM Agent项目推荐清单
  • 字符串替换 (模拟)神奇数 (数学)DNA序列 (固定长度的滑动窗口)
  • 为什么 npm list -g 没显示 node_modules?✨
  • 【Linux】TCP_Wrappers+iptables实现堡垒机功能
  • 基于 SysTick 定时器实现任务轮询调度器
  • 嵌入式硬件篇---Uart和Zigbee
  • 基于MATLAB/simulink的信号调制仿真--AM调制
  • 数学知识——欧拉函数
  • WHAT - React 技术栈常用库/工具
  • 用AI无差别转换技术协议到生产工艺
  • 硬件知识积累 单片机+ 光耦 + 继电器需要注意的地方
  • [打印机] 惠普打印机的安装和配置
  • 蓝桥杯速成刷题清单(上)
  • grok 驱动级键盘按键记录器分析
  • 扒光HPM6800系列 | 强到起飞的显控MCU介绍
  • 人工智能在高中教育中的应用现状剖析与挑战应对
  • 【QT】QWidget 概述与核心属性(API)
  • 营销网络分布图/seodao cn
  • 中国网通做网站/一个产品的市场营销策划方案
  • 郑州防控升级/seo网站诊断顾问
  • 松江新城做网站公司/网络营销手段有哪些方式
  • 做网站前产品经理要了解什么/seo的优化步骤
  • 郑州网站推广优化报价/seo站长