欧根喵
欧根喵
Published on 2025-04-02 / 33 Visits
0
0

学习记录 - java 【2】

2025/4/2

java 内存图

主要分为 栈,堆,方法区,本地方法 ,寄存器 其中 栈 堆 方法区 需要主要学习

运行顺序 ->方法区内存 -> 栈内存会在加载到内存中 同时给变量名对应一个堆内存中的对应的内存地址

| -> 把变量名对应的数据拆开分配到堆内存中 返回栈内存一个地址

  • 1. 核心区域功能

    • 方法区(Method Area)​

      • 存储内容:类信息(字段、方法、构造器)、运行时常量池、静态变量(JDK8后静态变量移至堆中的Class对象)、JIT编译后的代码等。

      • 特点:线程共享,逻辑上属于堆的一部分,但具体实现因JVM版本而异(如JDK8用元空间替代永久代)。

    • 堆(Heap)​

      • 存储内容:所有对象实例及数组。

      • 特点:线程共享,垃圾回收的主要区域。对象实例的成员变量(实例变量)存储于此。

    • 栈(Stack)​

      • 存储内容:每个线程私有的栈帧,包含局部变量(基本类型值、对象引用)、操作数栈、动态链接等。

      • 特点:方法调用时创建栈帧,执行结束后销毁。

    • 本地方法栈 & 程序计数器

      • 前者处理Native方法,后者记录当前线程执行地址,开发者通常无需直接操作。

步骤1:类加载到方法区

  • Example.class被加载到方法区,存储类信息(如main方法代码、静态变量等)。

​步骤2:执行main方法

  • 线程为main方法创建栈帧,压入栈中。

​步骤3:分配局部变量

  • 基本类型(int num = 42)​

    • 42直接存入栈帧的局部变量表。

  • 引用类型(String str = new String("Hello"))​

    • new String("Hello")在堆中分配内存,存储字符串数据。

    • 栈中的str变量保存堆中对象的地址(如0x100)。

​步骤4:对象内部数据分配

  • 堆中的String对象包含字段(如value数组),这些字段在堆中按类结构排列。

​步骤5:方法结束

  • main方法执行完毕,栈帧弹出,局部变量销毁。堆中的对象等待垃圾回收。


Comment