腾讯面试拷打:对象一定会分配在堆中吗?

太长不看版: 不一定,还可能分配在栈上。如果这个对象是热点代码,在JIT中运行,且开启了逃逸分析,而且也满足标量替换,那么它就会被分配在栈上。

详细了解需要知道以下知识:热点代码、JIT、逃逸分析、标量替换、栈上分配。

JIT(及时编译器 Just In Time)

热点代码(Hot Spot Code): 当虚拟机发现某个方法或代码块的运行特别频繁(执行次数多,被频繁调用),就会把这些代码认定为“热点代码”。 HotSpot JVM 采用了基于计数器的热点探测,虚拟机会为每个方法,甚至是代码块建立计数器,统计方法执行次数。某个方法超过阈值就被认为是热点方法。

image-20240402152032065

JIT会把部分“热点代码”编译成本地机器相关的机器码,并进行优化,然后再把编译后的机器码缓存起来,以备下次使用。

逃逸分析

逃逸分析:让对象本身被外部调用。这里user对象return了。这是方法逃逸。

image-20240402153906967

逃逸有三种程度:从不逃逸、方法逃逸、线程逃逸。

image-20240402154040502

栈上分配:不支持线程逃逸

image-20240402154333942

标量替换:只能是从不逃逸

image-20240402155253452

总结:虽然书中说方法逃逸也能栈上分配。但是bing上查了很多文章,都讲了还得开启标量替换才能栈上分配。

所以面试问的话,就答下面这张图。在JIT中、开启逃逸分析,满足标量替换->栈上分配。

image-20240402160958696

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值