网易二面:Java中变量是存储在堆中还是栈中?

文章内容收录到个人网站,方便阅读hardyfish.top/

变量存放位置的判断依据

Java运行时内存主要分为:

栈(Stack) :线程私有,存放方法调用相关数据。

堆(Heap) :线程共享,存放对象实例。

方法区 / 元空间(Method Area / Metaspace) :存放类元信息、常量池、静态变量。

判断依据:

基本类型的值 (除 String 这种引用类型外)。

  • 如果是方法的局部变量 → 存在栈帧的局部变量表
  • 如果是对象的成员变量 → 存在对象实例中(堆里)

引用类型变量

  • 引用本身(指向对象的地址)存放在栈帧局部变量表或对象实例中。
  • 对象本体存放在堆中。

类的元数据、常量池、静态变量 → 方法区 / 元空间。

方法内局部变量的存放位置

示例:

java 复制代码
public void test() {
    int num = 10;           // 基本类型值:栈
    String str = "abc";     // 引用:栈;"abc":字符串常量池(方法区)
    User user = new User(); // 引用:栈;对象:堆
}

分析:

num:基本类型的局部变量 → 栈。

str:引用在栈,字符串常量存方法区。

user:引用在栈,对象实例在堆。

特殊情况:逃逸分析与栈上分配

JIT 编译优化时,如果对象不会逃出当前方法(没有被其他线程或方法引用),JVM 可将对象分配在栈上或进行标量替换。

优势:减少 GC 压力。

开启方式(JDK 8 默认开启):

ruby 复制代码
-XX:+DoEscapeAnalysis
-XX:+EliminateAllocations

总结表

类型 场景 存放位置
基本类型局部变量 方法内声明
基本类型成员变量 对象属性 堆(跟随对象)
引用类型局部变量 方法内声明 引用在栈,对象在堆
引用类型成员变量 对象属性 引用和值都在堆(对象内部)
静态变量 类加载时 方法区 / 元空间
常量 编译期常量池 / 运行时常量池 方法区 / 元空间
相关推荐
lazy H43 分钟前
从入门到日常开发,一篇文章掌握 Git 核心操作
git·后端·学习·github
腻害兔8 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
GetcharZp9 小时前
抛弃低效SSH!这套Ansible+Web可视化神器,让你天天准点下班!
后端
码智社9 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
触底反弹9 小时前
🔥 2026 大模型选择指南:别再只看 Benchmark 了,这些维度才是关键!
人工智能·面试
萧瑟余晖10 小时前
JDK 26 新特性详解
java·开发语言
马优晨11 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
醇氧11 小时前
CountDownLatch / CyclicBarrier / Semaphore 面试高频问答清单
前端·面试·职场和发展
weixin_4462608512 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask