前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面试题24:什么是栈上分配?

面试题24:什么是栈上分配?

作者头像
爪哇缪斯
发布2023-05-09 21:38:06
2070
发布2023-05-09 21:38:06
举报
文章被收录于专栏:爪哇缪斯爪哇缪斯

【对象的分配】

首先,我们先看了解一下Java对象分配的整体流程图是怎样的:

  • 如果开启栈上分配,JVM会先进行栈上分配;
  • 如果没有开启栈上分配或不符合条件,则会进行TLAB分配;
  • 如果TLAB分配不成功且不满足进入老年代的条件,在eden区分配
  • 如果对象满足了直接进入老年代的条件,那就直接在老年代分配。

下面我们以一张流程图展现一下上面的文字描述:

综上所述,我们可以得出以下结论:

并不是所有对象都分配在堆上,除了堆(绝⼤多数对象分配到堆上)以外,还有两个地⽅可以存放对象——栈和TLAB。


【栈上分配】

  • 栈上分配是JVM提供的一项优化技术。
  • 基本思想如下所示:
    • 对于那些线程私有的对象(即:不可能被其他线程访问的对象),可以将它们打散分配在栈上,而不是分配在堆上。
    • 分配在栈上的好处是可以在函数调用结束后自行销毁,而不需要垃圾回收器的介入,从而提高系统的性能。
    • 对于大量的零散小对象,栈上分配提供了一种很好的对象分配优化策略,栈上分配速度快,并且可以有效避免GC带来的负面影响,但是由于和堆空间相比,栈空间较小,因此对于大对象无法也不适合在栈上分配。
  • 栈上分配的技术基础,两者必须都开启:
    • 逃逸分析:逃逸分析的目的是判断对象的作用域是否有可能逃逸出函数体。
    • 标量替换:允许将对象打散分配在栈上。比如:若一个对象拥有两个字段,会将这两个字段视作局部变量进行分配。
  • 只能在server模式下才能启用逃逸分析;
  • 查看当前jvm所有配置的系统参数值状态
  • 参数-XX:+DoEscapeAnalysis启用逃逸分析(默认开启)

【解释】Java SE 6u23版本之后,HotSpot中默认就开启了逃逸分析,可以通过选项-XX:+PrintEscapeAnalysis查看逃逸分析的筛选结果。

  • 参数-XX:+EliminateAllocations开启标量替换(默认打开)。
  • 参数-XX:-UseTLAB关闭TLAB(默认打开)

【举例】

  • AssignOnStack.java
  • 当开启栈上分配的时候,输出如下:
  • 当关闭栈上分配(即:关闭逃逸分析或标量替换中的任何一个)再次执行的时候,输出如下:
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爪哇缪斯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档