JVM--虚拟机方法调用

概述

Java能做到一次编译,随处运行,最要是归功于java虚拟机 和class文件,我们知道,计算机是0和1 的世界,并且只认0和1,所以不管是什么语言什么编译类型,最终给计算机的都是0和1,java也不例外,但是我们的java编译成了class文件,class怎么就转换成0和1了呢,或者说机器码呢?其实这一步是虚拟机帮我们干的。当然,虚拟机是建立在不同平台的,不同架构或者运行环境的基础上。虚拟机执行引擎 帮我们执行class文件。执行引擎在执行Java代码的时候可能有解释执行和编译执行两种选择。

虚拟机方法栈

我们知道,jvm内存区域大致分为 堆,虚拟机栈,方法区,程序计数器,本地方法区。只有虚拟机栈和程序计数器属于线程私有,其他是线程共享。 所以虚拟机在方法调用时。会创建栈帧,一个方法调用创建一个栈帧,压如方法栈。只有栈顶的栈帧是活动的。

栈帧构造

1766625387f8372cd7290301.jpg

  • 局部变量表 1、 在调用非类方法时,局部变量表默认0为位this指向当前类(这也是类方法无法调用局部变量初步、非类方法的原因); 2、局部变量表可以重用,方法体中定义的变量作用于不一定覆盖整个方法体,如果当前字节码PC计数器的值已经超出了某个变量的作用域,那么这一个Slot就可以交由其他变量使用(局部变量表是可以作为GC Roots的,手动对不使用的变量赋值null将有利于垃圾回收)。 3、对于类变量即使未赋值也可以使用(准备阶段赋予初始值),但是对于局部变量不赋值是无法使用的。

  • 操作数栈

    1、 与局部变量表相同,操作数栈的最大深度也被写入到了Code属性的max_stacks数据项之中。当一个方法刚开始时,此方法的操作数栈为空,在方法的执行过程中,会有各种字节码指令向操作数栈写入和提取内容。 2、 操作数栈中的元素的数据类型必须要与字节码指令的序列严格匹配,这一部分主要通过编译器在字节码生成过程中进行检测,当然在类载入的检验阶段也会对这一部分的内容进行验证,以保证Java程序的正确性。 3、 在传统的栈帧模型中,每一个栈帧相互之间都是完全独立的,但是在实际的JVM实现中会进行一定的优化处理,通过让两个栈帧出现一部分的重叠(调用方法的操作数栈、被调用函数函数的局部变量栈),这样在方法调用时就不需要额外的参数传递了。

  • 动态连接 参考 JVM--分派(动态和静态)

  • 返回地址 当一个方法被调用时,有两种方式退出这种方法:

1、正常完成出口:执行引擎遇到了一个方法返回的字节码指令(ireturn),这时候可以将操作数栈的返回值传递给上层的方法调用者;

2、异常完成出口:在方法执行过程中遇到了异常(JVM内部异常,athrow抛出异常),同时在本方法的异常表中未搜索到该异常,则会导致方法退出。

3、一般来说,方法正常退出时,调用者的PC计数器的值就可以作为返回地址。对于方法异常退出,返回地址则要通过异常处理器来确定,栈帧中一般不会存储这一部分的信息。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid