太长不看版: 不一定,还可能分配在栈上。如果这个对象是热点代码,在JIT中运行,且开启了逃逸分析,而且也满足标量替换,那么它就会被分配在栈上。
详细了解需要知道以下知识:热点代码、JIT、逃逸分析、标量替换、栈上分配。
JIT(及时编译器 Just In Time)
热点代码(Hot Spot Code): 当虚拟机发现某个方法或代码块的运行特别频繁(执行次数多,被频繁调用),就会把这些代码认定为“热点代码”。 HotSpot JVM 采用了基于计数器的热点探测,虚拟机会为每个方法,甚至是代码块建立计数器,统计方法执行次数。某个方法超过阈值就被认为是热点方法。
JIT会把部分“热点代码”编译成本地机器相关的机器码,并进行优化,然后再把编译后的机器码缓存起来,以备下次使用。
逃逸分析
逃逸分析:让对象本身被外部调用。这里user对象return了。这是方法逃逸。
逃逸有三种程度:从不逃逸、方法逃逸、线程逃逸。
栈上分配:不支持线程逃逸
标量替换:只能是从不逃逸
总结:虽然书中说方法逃逸也能栈上分配。但是bing上查了很多文章,都讲了还得开启标量替换才能栈上分配。
所以面试问的话,就答下面这张图。在JIT中、开启逃逸分析,满足标量替换->栈上分配。