当前位置: 首页 > wzjs >正文

除了wordpress南京seo报价

除了wordpress,南京seo报价,有没有像一起做网店做男装的网站,专门做旅游的网站有哪些JVM规范之栈帧 前言正文概述局部变量表操作数栈动态链接 总结参考链接 前言 上一篇文章了解了JVM规范中的运行时数据区: JVM规范之运行时数据区域 其中,栈是JVM线程私有的内存区,栈中存储的单位是帧(frames)&#xff…

JVM规范之栈帧

  • 前言
  • 正文
    • 概述
    • 局部变量表
    • 操作数栈
    • 动态链接
  • 总结
  • 参考链接

前言

上一篇文章了解了JVM规范中的运行时数据区:
JVM规范之运行时数据区域
其中,栈是JVM线程私有的内存区,栈中存储的单位是帧(frames),本篇文章通过JVM8规范学习栈帧在JVM运行时的作用。

正文

概述

每个栈帧的内存分配自线程私有的 Java 虚拟机栈(JVM Stack),线程调用方法时压栈,方法结束时出栈销毁。

帧的作用是保存方法调用的局部变量、中间结果、执行动态链接、方法返回信息、发送异常。一个帧通常包含局部变量表、操作数栈、运行时常量池引用,这些组件都是帧私有的。

创建/销毁时机:
当方法被调用的时候,栈帧也会被创建,当方法调用完成时,栈帧被销毁,方法调用的含义包含两种:

  • 方法正常调用结束,方法运行期间,JVM 没有抛出或者没有显式地使用throw抛出未被捕获的异常;
  • 方法非正常结束(如抛出未捕获异常)时,栈帧会提前销毁,JVM 通过异常栈轨迹(StackTrace)记录各层栈帧信息,用于调试;

内存分配策略:
局部变量表和操作数栈的大小在编译时确定,运行时常量池引用的大小本质是一个指针,具体大小可能取决于具体的 JVM 实现,因此栈帧的大小由编译时确定的局部变量表和操作数栈的理论最大值,结合 JVM 实现的内存布局(如 Slot 字节数、对齐策略)决定。

局部变量表

  • 每个栈帧都有自己的局部变量表,局部变量表的大小是在编译时确定的,因此在运行时可以一次性从栈上进行分配;
  • 局部变量表通过索引的方式访问,每个索引的位置可以理解一个变量槽(slot),每个槽可以存储boolean, byte, char, short, int, float, reference, returnAddress类型的值,一对slot可以存储longdouble类型的值;
  • longdouble占用两个连续的变量槽,比如一个long占用了索引nn+1两个变量槽的位置,但是n+1位置是不可读取的,可以被写入,这会导致变量槽n位置的数据失效;
  • JVM 规范没有限制局部变量表中的数据必须进行字节对齐;
  • 在调用方法时,JVM 使用局部变量表传递参数,从索引位置 0 开始,如果调用的方法是一个实例方法,索引 0 位置总是被传入this;对于静态方法,局部变量表索引 0 不存储this,直接从索引 0 开始存储方法参数。

操作数栈

  • 每个栈帧都包含一个操作数栈,栈的最大深度是编译时确定的,当栈帧被创建时,操作数栈是空的;
  • 操作数栈符合栈的特点,LIFO,操作数栈中每个entry可以容纳一个JVM数据类型,包含longdouble类型;
  • 操作数栈中存储的数据类型和操作指令必须严格匹配,JVM会在进行class文件验证时,检查操作数栈的使用是否符合规范;
  • 操作数栈中,long/double作为 64 位值,占用 2 个深度单位,其他类型占 1 个;

动态链接

什么是动态链接?
在 JVM 中,动态链接类加载机制运行时环境的关键环节,主要用于将符号引用(Symbolic References)解析为直接引用(Direct References),是实现多态的核心技术。

  • 每个栈帧都包含一个运行时常量池的引用,用于实现方法调用的动态链接过程;
  • 字节码文件中描述了方法调用的符号表引用,但是并没有实际代码的内存地址,因此动态链接是将符号表引用翻译为直接引用;
  • 动态链接是实现多态的核心机制,通过运行时常量池解析虚方法的符号引用,在运行时根据对象实际类型(如instanceof)找到具体方法的直接引用。例如,子类重写父类方法时,编译期符号引用指向父类,运行时动态链接到子类实现。

补充:

  • 在编译阶段,字节码文件中仅保存符号表引用,不会涉及静态链接或者动态链接的过程;
  • 静态链接在类加载阶段(解析阶段)确定方法调用目标,将符号表引用转化为直接引用,而动态链接指JVM在运行时才能确定调用目标的实例类型,在运行时将符号表引用转化为直接引用。

动态链接代码示例

public class Animal {public void sound() {System.out.println("Animal"); } // 虚方法
}
public class Dog extends Animal {@Overridepublic void sound() {System.out.println("Woof");} // 动态链接目标
}
// 调用时通过运行时常量池解析为Dog.sound()
Animal animal = new Dog();
animal.sound(); // invokevirtual指令触发动态链接

总结

本篇文章根据JVM 8规范了解了栈帧的数据结构:

  • 栈帧是在JVM线程进行方法调用时创建,每调用一个方法就会创建一个栈帧,每当方法调用结束或者异常结束,栈帧会被出栈;
  • 每个栈帧通常包含局部变量表、操作数栈、运行时常量池引用,栈帧的内存占用大小仅取决于JVM的实现,其中,局部变量表类似一个数组,JVM线程通过索引的方式读取局部变量表的内容;操作数栈用于保存中间结果和方法保存结果,要求操作数栈中的数据类型和指令必须匹配;运行时常量池引用是JVM实现动态链接的关键,当然也用来支持类字段引用和其它常量的访问;

JVM 规范仅定义栈帧的逻辑结构(如局部变量表、操作数栈),具体实现(如 Slot 是否对齐、指针压缩)由厂商决定。例如,HotSpot 中 Slot 通常为 32 位,long/double占 2 个 Slot,无需 64 位对齐。

参考链接

jvm8s

http://www.dtcms.com/wzjs/51493.html

相关文章:

  • 网站备案是备什么互联网营销的优势
  • 乐平网站建设抖音指数
  • 手机如何自制网站关键词自助优化
  • 崆峒区城乡建设局网站百度关键词排名代发
  • 政府网站系统源码百度seo推广优化
  • 做视频网站需要哪些条件网站关键词排名服务
  • 网站小空间友情链接只有链接
  • 网站赚取广告费品牌推广工作内容
  • 网站建设学什么的手机制作网页
  • 企业网站建设的主要内容电商推广
  • 高埗镇网站建设公司东莞网络优化服务商
  • 学院网站建设实例关键词免费网站
  • 珠海北京网站建设网站优化排名易下拉软件
  • 表格布局的网站百度快照
  • cookie做网站访问量seo公司系统
  • wordpress 图片idseo代理计费系统
  • 广东新闻联播直播回放排名优化网站
  • 开封旅游网站建设网页推广关键词排名优化品牌
  • 免费网站建设垂询186 6159 6345网络服务电话
  • 凤凰世界疫情最新数据廊坊seo建站
  • 网站建设客服电话怎么找整站优化推广
  • 哪些网站可以做微信推送广州网站关键词排名
  • 免费做威客的网站百度网盘下载电脑版官方下载
  • 昆明网站建设优化技术全网推广软件
  • 阿里网站导航怎么做的百度推广产品
  • 安阳网站建设公司广州google推广
  • 做淘宝客网站需要做后台吗济南做网站公司
  • 品牌网站品牌理念老旧的后果推广的渠道和方法有哪些
  • wordpress可以企业网站网站免费下载安装
  • 佛山网站建设佛山关键词首页优化