day1背背面经102:JVM 内存模型结构层次梳理╰(*°▽°*)╯

在 JVM 内存管理中,我们通常将内存分为多个区域,每个区域有其独特的用途和特性。为了确保层次结构的清晰,我们应该从整体架构开始,然后逐层细化各个区域。

1. JVM 内存管理的主要区域
  • JVM 内存模型 是一个层次化的结构,主要由以下几部分组成:
    • 方法区(Method Area)
    • 堆(Heap)
    • 栈(Stack)
    • 本地方法栈(Native Method Stack)
    • 程序计数器(Program Counter Register)
2. 方法区(Method Area)
  • 方法区是所有线程共享的内存区域,主要用于存储类信息、常量、静态变量、即时编译后的代码等。可以说,方法区的核心作用是存储 类的结构信息

  • 常量池(Constant Pool) 属于方法区的一部分,常量池中存储的是编译时确定的常量,如 字符串常量类名方法名 等。为了减少内存消耗和提高性能,常量池优化了常量的存储,特别是字符串常量池,避免了重复存储同一个常量。

  • JVM 的方法区包含

    • 类的信息:包括类名、字段名、方法名等。
    • 常量池:存储编译时确定的常量信息,如字符串字面量、类常量、方法常量等。
    • 静态变量:这些变量属于类,而非类的实例。
    • 即时编译后的代码(JIT 编译后的代码)。
3. 堆(Heap)
  • 堆是 JVM 中最大的一块内存区域,主要用于存储 对象实例数组。所有使用 new 关键字创建的对象都会被分配到堆中。

  • 垃圾回收器(GC)主要在堆中运行,回收不再使用的对象。堆内存分为年轻代和老年代:

    • 年轻代:存储新创建的对象,垃圾回收频繁。
    • 老年代:存储生命周期较长的对象,垃圾回收频率较低。
4. 栈(Stack)
  • 栈是每个线程私有的内存区域,用于存储方法的 局部变量方法调用的参数返回地址

  • 每次方法调用时,JVM 会为该方法分配一个栈帧,栈帧包括:

    • 局部变量区:存储方法中的局部变量。
    • 操作栈:存储操作数据和中间计算结果。
    • 方法返回地址。
  • 栈内存的回收非常高效,栈帧会随着方法调用的结束而自动释放。

5. 本地方法栈(Native Method Stack)
  • 本地方法栈是专门用于处理 本地方法 的栈。Java 的本地方法是指通过 JNI(Java Native Interface)调用的 C/C++ 代码。每个本地方法调用都会在本地方法栈中分配一个栈帧。
6. 程序计数器(Program Counter Register)
  • 程序计数器是一块较小的内存区域,主要用于存储当前线程正在执行的字节码的地址。每个线程都有自己的程序计数器。
7. 总结:层次结构

从层次结构的角度,我们可以理解 JVM 内存模型的划分如下:

  1. JVM 内存区域
    • 方法区
      • 常量池
      • 类的结构信息(如字段、方法等)
    • 本地方法栈
    • 程序计数器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值