前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JVM-Java虚拟机栈再学习

JVM-Java虚拟机栈再学习

作者头像
晓果冻
发布2022-06-17 15:22:36
2230
发布2022-06-17 15:22:36
举报
JVM-Java虚拟机栈再学习
  • 位于RAM,栈指针向下移动,则分配内存,向上移动,则释放内存。
  • 当运行某段方法或程序时,虚拟机栈必须知道被存放在栈内所有数据的大小和生命周期。以便按照上述的分配存储方法通过上下移动指针来动态调整内存空间,这也是为什么程序内部数量庞大的Java对象一般不被存放在栈上的原因了。
  • 速度快、每个线程数据共享(逃逸分析,优化程序)
  • 只能存储一些基本数据类型的变量:int、short、long、double、byte、float、double、boolea、char、对象引用还有逃逸分析后的一些数据。
  • 线程私有,和Java线程同一时间创建。
  • 栈帧(由3大部分组成)
    • 局部变量区
      • 基本单位:字(后续GC优化点)。
      • Java程序编译为Class文件时,就在方法的Code属性的max_locals数据项中确定了该方法所需要分配的局部变量表的最大容量。
      • 存放参数和方法内部的引用。
      • 定义为一个从0开始的数组,byte、char、short等在存储时被转换为int类型。局部变量区是通过下标来访问的。
      • 对非静态方法,虚拟机还会将当前对象(this)作为参数通过局部变量区传递给当前方法。默认是数组下标为0的。
      • 局部标量的垃圾回收案例:案例一案例二案例三
  • 操作数栈.
    • 被组织为一个数字数组,但是是通过push(进栈)和pop(出栈)来使用的。
    • 先进后出、后进先出。
      • 在编译为Class文件是,操作数栈的最大深度也被存储在方法的Code属性的max_stacks中。(最大深度不超过max_stacks中设定的最大值)
      • 操作数栈中的元素类型必须与字节码指令中的严格匹配,例如加法,一个int与一个float的情况。
  • 帧数据区
    • 解析常量池中的数据。
    • 方法执行完,恢复调用方法现场。
    • 方法执行过程中抛出异常表,这里有一个异常表,当异常出现时查找异常表来看是否有catch语句,如果没有就终止这个方法的调用。
  • 栈帧(细分)
    • 局部变量表
      • 局部变量区的子集
    • 操作数栈
    • 栈帧信息
      • 静态解析
      • 动态链接
      • 方法返回地址
        • 恢复调用现场
      • 附加信息
    • 方法调用
      • 一切方法调用在Class文件里存储的都是符号引用,而不是实际运行时的内存布局。
    • 解析(在类装载解析阶段就会把涉及的符号引用全部转换为确定的直接引用)
      • 一切方法调用在Class文件里存储的都是符号引用,在类加载解析阶段,会将一部分符号引用转化为直接引用。
      • final 修饰的方法也是非虚方法的一种,无法被覆盖,版本唯一。
      image-20220331093944055
      image-20220331093944055
    • 分派(案例)
      • 静态单分派
      • 静态多分派
      • 动态单分派
      • 动态多分派
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • JVM-Java虚拟机栈再学习
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档