Skip to content
DAILY QUOTE

“ ”

操作系统原生内存模型

适用视角:C/C++ 等编译型语言

在操作系统内核眼里,每个独立进程的虚拟地址空间遵循传统的线性分段布局。

  1. 栈区:

    • 寻址特征:地址由高向低生长,由 CPU 的栈指针寄存器直接操作。

    • 管理机制:遵循 LIFO(后进先出),函数调用结束即销毁。

    • 应用特性:支持静态分配。在 C/C++ 中,局部数组在编译阶段确定偏移量,运行时在栈帧中直接预留物理空间。

  2. 堆区:

    • 寻址特征:地址由低向高生长。

    • 管理机制:通过 malloc/freenew/delete 手动管理,通过空闲链表或位图算法进行空间分配。

  3. 数据段:

    • 职责:存储已初始化及未初始化的全局变量和静态变量。
  4. 代码段:

    • 职责:存储经过汇编后的机器指令。该区域通常受MMU(内存管理单元)保护,属性为只读。

JVM 运行时数据区

适用视角:Java/Kotlin 等虚拟机语言

Java 并不直接暴露物理地址,而是在操作系统堆区的基础上,由 JVM 虚拟化出一套逻辑内存模型。

  • 虚拟机栈:

    • 局限性:仅存储局部变量表(基本数据类型、对象引用地址)和操作数栈。

    • 非线性限制:Java 规范严格禁止在栈上直接分配对象或数组实体(除 JIT 编译器的逃逸分析优化外),旨在保持栈帧的轻量化。

  • **Java 堆:

    • 核心逻辑:作为 JVM 管理的最大一块内存,所有数组实体和对象实例均在此分配。

    • 分代假说:物理上通常划分为新生代和老年代(Old Generation),以适配垃圾回收(GC)算法。

  • 方法区 / 元空间:

    • 职责:存储类元数据(Class Metadata)、常量池、静态变量以及即时编译(JIT)后的代码缓存。

    • 物理演进:在 JDK 8 之后,从 JVM 内部移至本地内存(Native Memory),防止因类加载过多导致 OOM。

对比

维度C/C++ (物理/操作系统视图)Java (逻辑/虚拟机视图)
分配确定性开发者决定内存位置(栈 vs 堆)规范决定内存位置(基本类型栈,引用类型堆)
数组处理支持“值语义”数组,内存布局紧凑强制“引用语义”,数组是堆上的特殊对象
安全性存在指针算术,易发溢出攻击严格边界检查,禁止直接指针操作
回收效率栈上分配实现零成本回收依赖 GC 扫描引用链,存在 Stop-The-World