变量存放位置的判断依据Java运行时内存主要分为栈Stack 线程私有存放方法调用相关数据。堆Heap 线程共享存放对象实例。方法区 / 元空间Method Area / Metaspace 存放类元信息、常量池、静态变量。判断依据基本类型的值除 String 这种引用类型外。如果是方法的局部变量 → 存在栈帧的局部变量表 如果是对象的成员变量 → 存在对象实例中堆里引用类型变量引用本身指向对象的地址存放在栈帧局部变量表或对象实例中。 对象本体存放在堆中。类的元数据、常量池、静态变量 → 方法区 / 元空间。方法内局部变量的存放位置示例java体验AI代码助手代码解读复制代码public void test() { int num 10; // 基本类型值栈 String str abc; // 引用栈abc字符串常量池方法区 User user new User(); // 引用栈对象堆 }分析num基本类型的局部变量 → 栈。str引用在栈字符串常量存方法区。user引用在栈对象实例在堆。特殊情况逃逸分析与栈上分配JIT 编译优化时如果对象不会逃出当前方法没有被其他线程或方法引用JVM 可将对象分配在栈上或进行标量替换。优势减少 GC 压力。开启方式JDK 8 默认开启ruby体验AI代码助手代码解读复制代码-XX:DoEscapeAnalysis -XX:EliminateAllocations总结表类型场景存放位置基本类型局部变量方法内声明栈基本类型成员变量对象属性堆跟随对象引用类型局部变量方法内声明引用在栈对象在堆引用类型成员变量对象属性引用和值都在堆对象内部静态变量类加载时方法区 / 元空间常量编译期常量池 / 运行时常量池方法区 / 元空间