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方法执行完毕,栈帧弹出,局部变量销毁。堆中的对象等待垃圾回收。
