《深入理解java虚拟机》读书笔记(5)- JVM字节码执行引擎

深入理解JVM虚拟机第二篇:虚拟机概念和JVM整体架构以及字节码的执行路线 本文介绍了虚拟机的概念,以及虚拟机在软件与操作系统和硬件之间的地位,还介绍了JVM的整体架构和代码的简单的执行过程。 阅读详情

前言

面向的读者:

  • 有一定java基础
  • 想系统学习JVM基础知识

文章目的:

  • 自己读书笔记
  • 精炼知识点,实现输入输出闭环

一、运行时栈帧结构

JVM 运行的基本单元就是栈帧(Stack Frame)。
runtime stack
在活动线程中,只有位于栈顶的方法才是运行的。一个stack frame 结构如下:

  • 局部变量表(local variable table): 方法参数和方法内部定义的局部变量。按照slot 的方式进行分配。一个slot 是32位。double 和long 类型占用两个slot。
  • 操作数栈(operand stack):FIFO,每次都操作最顶端的数据。
  • 动态连接(dynamic link):常量池中的符号,通过动态连接转换成真正的内存地址。这种转换也分两种。静态解析:在加载时就已经确定地址。动态解析:在运行时才决定最终的物理地址。
  • 方法返回地址

二、方法调用

1. 解析

编译时可知,运行时不可变: 在加载时就已经知道方法调用的具体地址了。

  • 静态方法:与类型直接关联
  • 私有方法:在外部不可用

2. 分派

2.1 静态分派

package com.manulife;

public class StaticDispatch {
    static abstract class Human{}
    static class Man extends Human{}
    static class Woman extends Human{}
    public void sayHello(Human guy){
        System.out.println("hello, guy");
    }

    public void sayHello(Man guy){
        System.out.println("hello, gentleman");
    }

    public void sayHello(Woman guy){
        System.out.println("hello, lady");
    }

    public static void main(String[] args) {
        Human man = new Man();
        Human woman = new Woman();
        StaticDispatch sr = new StaticDispatch();
        sr.sayHello(man);
        sr.sayHello(woman);
    }
}

上面的代码,两次调用的结果都是 hello, guy. 为什么呢?
静态类型:Human 。 实际类型/运行时类型 : Man/Woman. 静态类型和动态类型在程序中都可能发生变化,区别是
动态类型:在使用时发生
运行时类型:在运行期间才可知。

        //实际类型在运行时才知道
        Human human = (new Random()).nextBoolean() ? new Man() : new Woman();
        
        //静态类型变化
        sr.sayHello((Man)human);
        sr.sayHello((Woman)human );

2.2 动态分派

public class DynamicDispatch {
    
    static abstract class Human{
        protected abstract void sayHello();
    }
    static class Man extends Human{
        @Override
        protected void sayHello() {
            System.out.println("Man say hello");
        }
    }
    static class Woman extends Human{
        @Override
        protected void sayHello() {
            System.out.println("woman say hello");
        }
    }

    public static void main(String[] args) {
        Human man = new Man();
        Human woman = new Woman();
        man.sayHello();  //invokevirtrual #22; //Method DynamicDispatch$Human.sayHello:()V
        woman.sayHello();//invokevirtrual #22; //Method DynamicDispatch$Human.sayHello:()V
        man = new Woman();
        man.sayHello();//invokevirtrual #22; //Method DynamicDispatch$Human.sayHello:()V
    }
}

从反编译的结果来看,在call 方法sayHello 的时候,生成的命令都是一样的。为什么会在运行时调用不同的方法,这个就得从 invokevirtual 命令说起:
invokevirtual 命令的执行过程如下:

invoke
另外: 由于invokevirtual指针对方法,因此字段不存在多态,当子类中含有与父类一样的字段时,会覆盖父类的字段。

gitlib安装、 团队 Git 协作完整教程(企业级标准流程) 最精简的一句话主分支不写代码,每人一条功能分支,每天同步,完成提交合并。 阅读详情

相关推荐

W5500 TCP服务器状态机详解:从SOCK_CLOSED到SOCK_ESTABLISHED的完整流程

本文深入解析W5500芯片作为TCP服务器时的状态机转换流程,从SOCK_CLOSED到SOCK_ESTABLISHED的完整链路实践。通过硬件协议栈架构分析、状态机全流程拆解及异常处理方案,帮助开发者构建高可靠性的嵌入式网络服务端,优化TCP连接性能与稳定性。

Jerry的专栏 1165

《深入理解Java虚拟机》第5章 调优案例分析与实战

5.2.1高性能硬件上的程序部署策略 监控服务器运行状况发现网站没有响应是由GC停顿导致的,虚拟机运行在Server模式,默认使用吞吐量优先收集器,回收12GB的堆,一次Full GC的停顿时间高达14秒。访问文档把其从磁盘提取到内存中,导致内存中出现很多由文档序列化产生的大对象。这些大对象很多进入了老年代,没有在Minor GC中被清理掉。 因此内存很快被消耗殆尽。 在高性能硬件上部署程序...

小夏要科学进步 465

Qt Design Studio 入门指南:从零开始打造炫酷UI(详细+实用+轻松上手)

本文是Qt Design Studio的详细入门指南,旨在帮助UI设计新手从零开始轻松打造炫酷界面。文章系统介绍了软件的核心概念、安装步骤、主界面解析,并通过创建一个完整的登录界面实例,手把手教学如何拖拽组件、设置属性、添加交互状态与动画。同时,分享了创建自定义组件、管理资源以及提升效率的实用技巧与常见问题解决方案,让读者能够快速上手并应用于实际项目开发。

devops8pract的博客 589

深入理解Java虚拟机----第四章:虚拟机性能监控与故障处理

第四章:虚拟机性能监控与故障处理

youngerZeng 459

微信小程序审核避坑指南:巧用 wx.getAccountInfoSync 实现审核与线上环境无感切换

本文详细介绍了如何利用`wx.getAccountInfoSync`API实现微信小程序审核与线上环境的无感切换。通过环境识别技术和动态渲染架构设计,开发者可以优雅解决审核资质门槛问题,同时保持生产环境的完整用户体验。文章包含组件化实现、全局状态管理等实用方案,帮助开发者提升审核通过率。

weixin_30527423的博客 260

5G无人机安全研究综述

国内多所高校提出混合信任模型,南京航空航天大学于2020年提出了起源信息感知的无人机网络信任模型[26],模型基于报文的完整性对报文创建和操作节点的行为评判并生成观测证据,收集证据进行信任评估,识别网络中的恶意节点并进行路由隔离,实现准确的对等信任评估。同时,5G技术的高速率、高可靠性、低时延等特点,能够为无人机提供实时高清图像回传,保证通信网络的稳定,拓展无人机飞控距离限制,丰富了5G无人机的应用场景。5G和无人机技术的融合,丰富了传统无人机的应用服务场景,然而5G无人机仍存在安全隐患。

weixin_70923796的博客 765

深入理解Java虚拟机-虚拟机执行子系统

文章目录类文件结构概述无关性的基石Class类文件的结构魔数与 Class 文件的版本常量池访问标志类索引、父类索引与接口索引集合字段表集合方法表集合属性表集合字节码指令简介公有设计和私有实现Class文件结构的发展虚拟机类加载机制概述类加载时机类加载过程加载验证准备解析初始化类加载器类与类加载器双亲委派模型类加载器的关系类加载器的作用类加载器的特点类加载器的隔离问题破坏双亲委派模型字节码执行引擎...

ThinkWon的博客 1万+

【RT-DETR有效改进】全新的SOATA轻量化下采样操作ADown(轻量又涨点,附手撕结构图)

本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的ADown模块来改进我们的Conv模块,其中YOLOv9针对于这个模块并没有介绍,只是在其项目文件中用到了,我将其整理出来用于我们的YOLOv8的项目,经过实验我发现该卷积模块(作为下采样模块)首先可以大幅度降低参数值,其次其精度上也有很高的提升,同时本文的内容目前网络上并无其它人总结(也是最新发布的,可以说BUff是集满了)大家可以尝试以下在自己数据集上的效果。

Snu77的博客 4774

《深入理解Java虚拟机 3》类加载机制与字节码执行引擎

本系列是用来记录《深入理解Java虚拟机》这本书的读书笔记。方便自己查看,也方便大家查阅。讲完了自动内存管理,我们来说说执行子系统。执行子系统讲解的是JVM如何执行程序。Class文件概述这篇我们只讲讲Class文件。Class文件又名类文件或字节码文件。javac将.java文件(源代码)编译成class文件(字节码),jvm再将.class文件解释成机器码。Class文件中包含的是java虚拟机指令集和符号表以及若干其它辅助信息。其是一组以8字节为基础单元的二进制流,没有空隙存在。

2401_85763952的博客 893

Android14 Qcom 从Framework到Driver带你打开WIFI(二)

上篇文章讲到了UI打开WIFI以后,逐步调用到加载底层驱动以及通知等相关流程。这篇接着上文继续往下看WIFI ON的后续动作。

IAYLBL的博客 766

Ego Planner规划算法(下)——Ego Planner程序框架

本系列文章用于学习记录Ego-Planner规划算法的相关内容,本系列文章是在在Fast Planner规划算法系列文章的基础上,展开对Ego Planner的相关介绍,主要包括Ego Planner算法流程和程序框架两部分,主要学习资料是深蓝学院的移动机器人运动规划课程

慕羽★的博客 7260

深入理解JVM之虚拟机字节码执行引擎

读了深入理解JVM之虚拟机字节码执行引擎这一章,

Sweet Baby,甜宝 1681

2024年11月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(一)

软考高级系统架构设计师考试包含三个科目:信息系统综合知识、案例分析和系统架构设计论文。考试形式为机考。本文主要回顾2024年下半年(2024-11-10)系统架构设计师考试上午第二科案例分析的题目,同时附带参考解答、解析和所涉知识点。

一几文的编程学习笔记。 2418

深入理解Java虚拟机:Jvm总结-虚拟机字节码执行引擎

不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果。

Oceáno的博客 1655

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JVM篇·虚拟机字节码执行引擎

虚拟机字节码执行引擎 本文为《深入理解Java虚拟机_JVM高级特性与最佳实践·周志明》学习笔记 文章目录虚拟机字节码执行引擎运行时栈帧结构局部变量表操作数栈动态连接方法返回地址附加信息方法调用解析5条方法调用字节码非虚方法分派静态分派重载重写场景重载优先级动态分配invokevirtual执行分派步骤单分派&多分派虚拟机对动态分派的实现动态类型语言支持动态类型语言Java的动态类型支持原理反射与MethodHandle对比基于栈的字节码解释执行引擎解释执行基于栈/寄存器的指令集对比 运行时栈帧

qq_37419449的博客 6611

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

深入理解jvm执行引擎

由上图可见,java的编绎过程分为二步。第一步由java文件编绎成class文件,这个过程叫做前端编绎;第二步把需要加载到jvm中的class文件中的字节码编绎成操作系统能够识别的机器码,这个过程叫做后端编绎。

dzend的专栏 2128

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

深入理解JVM字节码执行引擎

我们都知道,在当前的Java中(1.0)之后,编译器讲源代码转成字节码,那么字节码如何被执行的呢?这就涉及到了JVM的字节码执行引擎,执行引擎负责具体的代码调用及执行过程。就目前而言,所有的执行引擎的基本一致:输入:字节码文件处理:字节码解析输出:执行结果。物理机的执行引擎是由硬件实现的,和物理机的执行过程不同的是虚拟机的执行引擎由于自己实现的。

程序员高级码农的博客 1041

一夜搞懂 | JVM 字节码执行引擎

前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 一.为什么要学习字节码执行引擎? 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步 首先,抛出灵魂三问: 虚拟机在执行代码的时候,如何找到正确的方法呢? 如何执行方法内的字节码呢? 执行代码时涉及的内存结构有哪些呢? 如果你对上...

weixin_36518952的博客 1265

深入理解Java虚拟机(三)——JVM内存结构+JVM执行引擎

目录 深入理解Java虚拟机(一)——JVM整体架构 深入理解Java虚拟机(二)——类加载器深入解析 深入理解Java虚拟机(三)——JVM内存结构+JVM执行引擎 深入理解Java虚拟机(四)——JVM性能调优监控工具 JVM内存结构 •本地方法栈(线程私有):登记native方法,在Execution Engine执行时加载本地方法库 •程序计数器(线程私有):就是一个指针...

z785495295的博客 1383

深入理解Java虚拟机:虚拟机字节码执行引擎

概述    在不同的虚拟机实现里面,执行引擎在执行Java代码的时候可能有解释执行和编译执行两种选择,也可能两者兼备,甚至还可能包含几个不同级别的编译器执行引擎。但从外观上,所有的Java虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。运行时栈帧结构    栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机运行时数据区中的虚拟机栈的栈元

LittleCoding的博客 897

深入理解JVM 第八章 虚拟机字节码执行引擎

深入理解JVM 第八章 虚拟机字节码执行引擎1 概述2 运行时栈帧结构2.1 局部变量表2.2 操作数栈2.3 动态连接2.4 方法返回地址 1 概述 在Java虚拟机规范中规定了虚拟机字节码执行引擎的概念模型,这个概念模型成为各种虚拟机执行引擎的统一外观(Facade)。在不同的虚拟机实现里面,执行引擎在执行Java代码的时候可能由解释执行(通过解释器执行)和编译执行(通过即时编译器产生本地代码执行)两种选择,也可能两者兼备,甚至还可能包含几个不同急别的编译器执行引擎。但从外观上看起来,所有的Java虚拟

Seven_Year1的博客 647

深入理解JVM虚拟机5:虚拟机字节码执行引擎

本文转自:https://www.cnblogs.com/snailclimb/p/9086337.html 本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how2playlife.com 本文...

AliCoder的博客 900

深入理解Java虚拟机 ch8 虚拟机字节码执行引擎 读书笔记

本章的内容是虚拟机字节码执行引擎。对象是字节码,工具是虚拟机执行引擎,执行单位为栈帧。讲述的是概念模型,详细说明在完成类加载过程后,采用解析和分派的方式确定方法调用的目标方法;并从主类的main()方法开始,执行程序的概念模型和各种细节。

ananhao的博客 642

JVM(Java虚拟机理论)

本地方法栈是JVM中为执行本地方法(Native Method)而准备的一块内存区域。本地方法指的是使用Java以外的语言(例如C或C++)编写,并通过Java Native Interface(JNI)或其他方式被Java程序调用的方法。这些方法直接在底层操作系统或硬件上运行,以实现一些Java语言无法直接处理的功能,如操作系统接口调用、硬件驱动程序操作等。字节码执行引擎是JVM中用于执行Java字节码的部分。Java编译器将Java源代码编译成字节码。

weixin_45722905的博客 3083

【Java虚拟机系列】- Java虚拟机字节码执行引擎

局部变量表是建立在线程堆栈中的,属于线程私有的数据Java程序被编译为Class文件时,就在方法的Code属性的max_locals数据项中确定了该方法所需分配的局部变量表的。

m0_68383079的博客 885

深入理解 JVM——类与字节码执行

本文深入解析了Java虚拟机的类文件结构与类加载机制。主要内容包括: 类文件结构、类加载机制、字节码执行引擎。本文系统阐述了JVM处理类文件的核心机制,为理解Java平台无关性提供了理论基础。

weixin_52344200的博客 631
上一篇: 《深入理解java虚拟机》读书笔记(7)- 线程安全与锁优化
下一篇: 深入Kafka(1)- Kafka 高性能设计
masternick
博客等级 码龄18年 2粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值