JVM--虚拟机方法调用

浩浩 等级 862 0 0

概述

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

虚拟机方法栈

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

栈帧构造

JVM--虚拟机方法调用

  • 局部变量表 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计数器的值就可以作为返回地址。对于方法异常退出,返回地址则要通过异常处理器来确定,栈帧中一般不会存储这一部分的信息。

收藏
评论区

相关推荐

Java里面的十万个为什么
Java里面的十万个为什么 1.不是说 JVM 是运行 Java 程序的虚拟机吗?那 JRE 和 JVM 的关系是怎么样的呢?简单地说,JRE 包含 JVM 。JVM 是运行 Java 程序的核心虚拟机,而运行 Java 程序不仅需要核心虚拟机,还需要其他的类加载器,字节码校验器以及大量的基础类库。JRE 除包含 JVM 之外,还包含运行 Java 程序的其
从未有人把JVM原理讲的这么详细
JVM原理1.简述JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可在多种平台上不加修改的运
限时发布!纯手打“RocketMQ笔记”
1 JVM的内存区域布局 java代码的执行步骤有三点 java源码文件编译器字节码文件 字节码文件JVM机器码 机器码系统CPU执行 JVM执行的字节码需要用类加载来载入;字节码文件可以来自本地文件,可以在网络上获取,也可以实时生成。就是说你可以跳过写java代码阶段,直接生成字节码交由JVM执行 其中Jav
大厂必备面试题———JVM内存结构
JVM 一,基本介绍解释:java虚拟机,准确的来说是java二进制字节码的运行环境。(jvm是一套规范),用来执行class文件,保证java语言跨平台。Java虚拟机可以看作是一台虚拟的计算机,和真是的计算机一样,有着自己的指令集以及各种运行时内存。jvm就是一个字节码翻译器,它将字节码文件翻译成各个系统对应的的机器码,确保字节码文件能在各个系统上正确的
JVM内存逻辑结构
JVM(Java Virtual Machine),即Java虚拟机。JVM是一种用于计算机设备的规范,它是虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能实现的。因此,能在JVM中执行的并不一定是Java语言的编译后字节码,也可以是其它语言,比如Jyphon、JRuby以及Groovy等。 下图为Java程序员最为关注JVM的内存模
Java基础笔记(一)——JDK、JRE、JVM
**JDK、JRE和JVM三者的关系** **Java程序执行过程** **JVM(java virtual machine)** 注:由于各种操作系统(windows、linux等)支持的指令集(二进制可执行代码)不同,程序代码在不同的操作系统上应该编写的也就应该不同。而Java中的.class字节码文件是种特殊的二进制文件,JVM认得它,可以将它翻
Java是如何实现跨平台的
一.Java是如何实现跨平台的 =============== 1.我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件 2.Java虚拟机JVM就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序。 ![](https:/
Java程序运行机制及开发环境
### **Java既是编译型语言,又是解释型语言** java源文件首先需要通过javac编译生成后缀名为.class的字节码文件(与平台无关,只面向JVM),然后使用Java虚拟机将字节码解释成特定平台上的机器码运行。 ###**Java虚拟机JVM** 不同平台上的JVM不同,但是都提供了相同的接口。 ###**开发Java准备** 1. 下
Java虚拟机(JVM)
Java虚拟机(JVM)一种用于计算机设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。 Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译
java 多进程
多进程的概念 * **一个JVM进程对应一个JAVA程序** * Java编写程序都运行在在Java虚拟机(JVM)中, * **在JVM的内部,程序的多任务是通过线程来实现的** * 每用java命令启动一个java应用程序,就会启动一个JVM进程。 * 在同一个JVM进程中,有且只有一个进程,就是它自己。
JVM入门到放弃之基本概念
### 1\. 基本概念 jvm 是可运行Java代码的假想计算机,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 jvm 是运行在操作系统之上的,屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在 jvm 上运行的字节码,就可以在多种平台上不加修改地运行。 Java 语言的一个非常重要的特点就是与平台的无关性(
JVM小常识
JVM小常识 ====== 概括 -- J(Java)V(Virtual)M(Mechine)就是我们所说的Java虚拟机。 JVM支持主流的操作系统,比如Windows、Linux、MacOS。Sun公司当时宣传Java说的是:“**一次编译,到处运行。**”就是通过JVM实现的。 ps.但是讲道理我对这句话存在一点疑惑,在一些JVM不支持的操作系
JVM必备指南
简介 -- Java虚拟机(JVM)是Java应用的运行环境,从一般意义上来讲,JVM是通过规范来定义的一个虚拟的计算机,被设计用来解释执行从Java源码编译而来的字节码。更通俗地说,JVM是指对这个规范的具体实现。这种实现基于严格的指令集和全面的内存模型。另外,JVM也通常被形容为对软件运行时环境的实现。通常JVM实现主要指的是HotSpot。 JVM
JVM运行机制(非原创)
文章大纲 ---- 1. JVM基本概念 2. JVM的体系结构 3. JVM启动流程 一、JVM基本概念 --------- 1. Java虚拟机(JVM)是可运行Java代码的假想计算机 2. Java虚拟机包括类加载器、一组寄存器、方法区、一个垃圾回收堆、直接内存、一个栈、和一个存储方法域、PC寄存器等 3. Java编译、运行流程如
tomcat配置
要使用Tomcat,首先需要安装jdk,JDK的全称是Java Development Kit,是Sun公司免费提供的Java语言的软件开发工具包,其中包含Java虚拟机(JVM) jvm虚拟机的作用就是把高级语言-----》编译成字节码-----》通过运算得出结果----》最后把东西发布 利用JVM解释这些字节码文件,从而保证了Java的跨平台性 安