JVM--虚拟机方法调用

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

收藏
评论区

相关推荐

JVM--虚拟机方法调用
概述 Java能做到一次编译,随处运行,最要是归功于java虚拟机 和class文件,我们知道,计算机是0和1 的世界,并且只认0和1,所以不管是什么语言什么编译类型,最终给计算机的都是0和1,java也不例外,但是我们的java编译成了class文件,class怎么就转换成0和1了呢,或者说机器码呢?其实这一步是虚拟机帮我们干的。当然,虚拟机是建立在不同
Java后端开发三年的程序员竟然还被JVM难住!果然JVM面试是有套路的!
前言JVM是面试中必问的部分,本文通过思维导图以面向面试的角度整理JVM中不可不知的知识。先上图:image1、JVM基本概念1.1、JVM是什么JVM 的全称是 「Java Virtual Machine」,也就是我们耳熟能详的 Java 虚拟机。JVM具备着计算机的基本运算方式,它主要负责把 Java 程序生成的
JMM 与 JVM的区别?很多人不清楚 ,一文带你了解得透透的
本篇文章我们主要分析一个大厂面试题:不要搞混 JMM 与 JVM。在面试的时候,有一个问题经常被问到,那就是 Java 的内存模型,它已经成为了面试中的标配,是非常具有原理性的一个知识点。但是,有不少人把它和 JVM 的内存布局搞混了,以至于答非所问。这个现象在一些工作多年的程序员中非常普遍,主要是因为 JMM 与多线程有关,而且相对于底层而言,很多人平常的
Java里面的十万个为什么
Java里面的十万个为什么 1.不是说 JVM 是运行 Java 程序的虚拟机吗?那 JRE 和 JVM 的关系是怎么样的呢?简单地说,JRE 包含 JVM 。JVM 是运行 Java 程序的核心虚拟机,而运行 Java 程序不仅需要核心虚拟机,还需要其他的类加载器,字节码校验器以及大量的基础类库。JRE 除包含 JVM 之外,还包含运行 Java 程序的其
Java学习路线
阶段一 (夯实基础)Java基础语法学习目标:1.熟悉Java等基本概念2.掌握Eclipse/IDEA集成开发工具的安装、配置和应用3.熟悉Java基本语法、基本类型、运算符和表达式4.掌握分支、循环逻辑语句、数组等知识的应用知识点列表:JDK、JRE、JVM基本概念Java环境搭建和配置安装和使用Eclipse/IDEA开发环境Java基本数据类型变量,
从未有人把JVM原理讲的这么详细
JVM原理1.简述JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。JVM屏蔽了与操作系统平台相关的信息,使得Java程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可在多种平台上不加修改的运
Java开发面试高频考点学习笔记(每日更新)
Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝 2.接口和抽象类的区别 3.java的内存是怎么分配的 4.java中的泛型是什么?类型擦除是什么? 5.Java中的反射是什么 6.序列化与反序列化 7.Object有哪些方法? 8.JVM内存模型 9.类加载机制 10.对象的创建和对象的布局 11.Java的四种引用
2021年度最全面JVM虚拟机,类加载过程与类加载器
前言类装载器子系统是JVM中非常重要的部分,是学习JVM绕不开的一关。一般来说,Java 类的虚拟机使用 Java 方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表
【面试必会】最新阿里+头条+腾讯大厂Java笔试真题
一、内存与线程 1、内存结构内存是计算机的重要部件之一,它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体发挥的水平。JVM的内存结构规定Java程序在执行时内存的申请、划分、使用、回收的管理策略,通说来说JVM的内存管理指运行时数据区这一大块的管理。 2、线程运行JVM中一个应用是可以有多个线程并行执行,线程
限时发布!纯手打“RocketMQ笔记”
1 JVM的内存区域布局 java代码的执行步骤有三点 java源码文件编译器字节码文件 字节码文件JVM机器码 机器码系统CPU执行 JVM执行的字节码需要用类加载来载入;字节码文件可以来自本地文件,可以在网络上获取,也可以实时生成。就是说你可以跳过写java代码阶段,直接生成字节码交由JVM执行 其中Jav
秋招已经开始准备了!【Java面试题】最新Java开发岗面试知识笔记
在最近两个月不断的面试中,我分类总结了 Java 开发岗位面试中的一些知识点。主要包括以下几个部分: 1. Java 基础知识点 2. Java 常见集合 3. 高并发编程(JUC 包) 4. JVM 内存管理 5. Java 8 知识点 6. 网络协议相关 7. 数据库相关 8. MVC 框架相关 9. 大数据相关 10. Linux 命令相关面试,
2021年度最全面JVM虚拟机,类加载过程与类加载器
前言类装载器子系统是JVM中非常重要的部分,是学习JVM绕不开的一关。一般来说,Java 类的虚拟机使用 Java 方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表
大厂必备面试题———JVM内存结构
JVM 一,基本介绍解释:java虚拟机,准确的来说是java二进制字节码的运行环境。(jvm是一套规范),用来执行class文件,保证java语言跨平台。Java虚拟机可以看作是一台虚拟的计算机,和真是的计算机一样,有着自己的指令集以及各种运行时内存。jvm就是一个字节码翻译器,它将字节码文件翻译成各个系统对应的的机器码,确保字节码文件能在各个系统上正确的
作为一个码农终于把这些笔记看懂了,牛皮轰轰
Spring面试高频问题 SpringMVC面试高频问题 MyBatis面试高频问题 SpringBoot面试高频题 SpringCloud面试高频问题 Redis高级面试题 Dubbo高频常问面试问题 Java虚拟机(JVM) MySQL数据库高频面试问题 Java高频面试专题合集解析:当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,在这也是
五面阿里巴巴拿offer后定级P6:分享Java面经及答案总结
一面(电话)说说对JVM的理解treemap和hashmap有什么区别?Java多线程的的5大状态图流转mysql主键和唯一索引的区别说说最近的项目如何实现session共享,用redis如何实现缓存击穿的概念和解决方案说说微服务,微服务之间如何管理二面(现场)java nio常?用的三个类java里面的同步锁了解吗?Countdownlauch和Cylic