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

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

变量存放位置的判断依据

Java运行时内存主要分为:

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

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

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

判断依据:

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

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

引用类型变量

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

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

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

示例:

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

分析:

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

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

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

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

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

优势:减少 GC 压力。

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

-XX:+DoEscapeAnalysis
-XX:+EliminateAllocations

总结表

基本类型局部变量

方法内声明

基本类型成员变量

对象属性

堆(跟随对象)

引用类型局部变量

方法内声明

引用在栈,对象在堆

引用类型成员变量

对象属性

引用和值都在堆(对象内部)

静态变量

类加载时

方法区 / 元空间

常量

编译期常量池 / 运行时常量池

方法区 / 元空间

#面试题#
大厂面试每日一题 文章被收录于专栏

大厂每日一道面试题!

全部评论

相关推荐

没参加过春招,自己正在参加,这方面先暂时不说了,我就来分享下暑期实习的建议:1.对于简历的实习部分:我是24年11月份开始准备的暑期实习,当时还没有实习,我就自己用ai包装了一下在学校参加的数学建模比赛的经历,把他作为项目经历;之后找我父母要了一家小公司的公章,直接包装了一段小厂实习(以上都不需要付费,都可以自己来包装,比如借助ai,牛客上的简历以及各种各样的网上项目,包装上公司的title),这样做之后,你的简历内容起码不会很空,对于找实习也有了底气。2.对于技术岗简历上的项目部分,不用追求独特,就做最经典的项目,有能力可以写点自己优化的demo,不写demo也可以,就把经典项目吃透,各类技术问题自己梳理一下,八股背熟即可。3.暑期实习开放时间,开的最早的是各大银行的实习项目和金融机构的实习,时间大概在25年12月份到26年3月份,大约三月份笔试,大家可以提前准备一下行测题,加油!接下来就是各大互联网大厂的暑期转正实习,大约在二月份开始,三四月份达到高峰,五月份补录,这类实习实际相当校招提前提前批,竞争大,可转正,集团重点培养,含金量很高---但我的建议是不要太在乎,竞争真的很大,大多数普通人都属于陪跑者,该投投,有面就面。重点!重点!重点!4。多数普通双非本硕求职者重点考虑日常实习即可,ssob,某聘,小某书上的实习继任贴,此类实习大厂中厂,独角兽,小厂,外包都有,这类岗位普遍是公司部门临时有需求,或因为实习生离职,或因为临时出现项目,或是没批出来招正式的预算,这类岗位普遍是业务部门直接招人,部门总监有决定权,招人紧急,会相对降低对应聘者的要求,流程也普遍很快,一般面试一到两轮就可以发offer了。一旦进入这种实习,进去可以沉淀产出,增加秋招竞争力,而且日常实习普遍工作压力不大,还可以继续寻找转正实习的机会。总之,大家放平心态,持续投递,不停刷题,加油附上我25年春季实习timeline:25年12月开始投递25年12月至25年3月,面试五十场+25年3月中旬面试头部外企实习25年4月中旬收到offer25年5月中旬背调通过,成功入职
备战春招/暑实,现在应该...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务