• Java虚拟机之JVM基础知识





    一、Java技术体系

    1、Java体系构成

    1)Java程序语言

    2)Java虚拟机

    3)字节码文件

    4)Java类库

    5)第三方Java类库

    2、JDK、JRE、JVM之间的关系

    1)JDK:Java程序语言、Java虚拟机和Java类库统称为JDK(Java Development Kit)

    2)JRE:Java类库中的Java SE和Java虚拟机统称为JDR(Java Runtime Enviroment)

    JDK、JRE、JVM关系图



    JVM介绍

    (1)JVM官方文档定义

    The Java Virtual Machine is an abstract computing machine. Like a real computing machine, it has an instruction set and manipulates various memory areas at run time. It is reasonably common to implement a programming language using a virtual machine; the best-known virtual machine may be the P-Code machine of UCSD Pascal.

    The Java Virtual Machine knows nothing of the Java programming language, only of a particular binary format, the class file format. A class file contains Java Virtual Machine instructions (or *bytecodes*) and a symbol table, as well as other ancillary information.

    (2)中文解释

    Java虚拟机是一个抽象的计算机(本质上就是可运行程序)。它和真实的计算机相似,具有指令集且能够在运行时对内存区域进行操作。Java虚拟机并不能直接解释Java语言,它只能够解释特定的二进制格式,即.class文件(字节码文件)。



    JVM结构

    HotSpotJVMArchitecture1



    Java代码执行流程

    Java代码执行流程1



    JVM架构模型

    1、指令架构

    (1)基于栈式架构

    ​ a)设计和实现更简单

    ​ b)指令集小,编译器易实现

    ​ c)不需要硬件支持,可移植性更好,更容易实现跨平台

    (2)基于寄存器架构

    ​ a)依赖硬件,可移植性查

    ​ b)执行效率高

    2、例子

    (1)Java源码

    public class StackTest {
    
        public static void main(String[] args) {
            int a = 2;
            int b = 3;
            int c = a + b;
        }
    }
    

    (2)C++源码

    void test() {
        int a = 2;
        int b = 3;
        int c = a + b;
    }
    

    (3)基于栈式结构计算过程


    使用jclasslib查看字节码

    jclasslib查看字节码1
    0 iconst_2    常量为2
    1 istore_1    将常量2保存至索引为1的操作数栈中
    2 iconst_3    常量为3
    3 istore_2    将常量2保存至索引为2的操作数栈中
    4 iload_1     加载操作数栈索引为1所对应的值
    5 iload_2     加载操作数栈索引为2所对应的值
    6 iadd        相加
    7 istore_3    将相加结果保存至索引为3的操作数栈中
    8 return      
    

    (4)基于寄存器结构计算过程

    Android studio编写完后使用ida查看指令,ARM32下的汇编指令

    基于寄存器架构指令1
    SUB             SP, SP, #0xC
    MOVS            R0, #2                      操作数2移动至R0寄存器 
    STR             R0, [SP,#0xC+var_4]         R0寄存器的值写入[SP,#0xC+var_4]地址
    MOVS            R0, #3                      操作数3移动至R0寄存器 
    STR             R0, [SP,#0xC+var_8]         R0寄存器的值写入[SP,#0xC+var_8]地址
    LDR             R0, [SP,#0xC+var_4]         [SP,#0xC+var_4]的值读入R0寄存器
    LDR             R1, [SP,#0xC+var_8]         [SP,#0xC+var_8]的值读入R1寄存器
    ADD             R0, R1                      R0, R1寄存器相加,结果放置R0寄存器
    STR             R0, [SP,#0xC+var_C]         R0寄存器的值写入[SP,#0xC+var_C]地址
    ADD             SP, SP, #0xC
    BX              LR
    

    3、思考

    网上常有结论,在完成相同操作的情况下,基于栈式架构比基于寄存器架构的指令路量要多。这种说法严谨吗?

    可以从上面例子中看出ARM32下的基于寄存器架构的指令数量并不比基于栈式结构的指令数量少。很多人只讨论了x86架构下的指令数量,而忽略了ARM架构下的指令集数量。



  • 相关阅读:
    使用VS2013直接升级到VS2019,Cmake编译CCC4.0版本错误记录
    最近使用LuaSqlite3时,不得不说的——事务提交ATTACH语句的巨坑
    LuaSocket学习之tcp服务端
    LuaSocket HTTP 初识记录
    LuaRocks安装教程
    Lua5.1-----函数可变参数详解
    DataTable与json互转,字段类型信息丢失问题初探
    json数组与对象数组
    asp.net中封装路由信息的对象--RouteData源码
    人类的心理行为模式(几个心理学实验)
  • 原文地址:https://www.cnblogs.com/boycelee/p/14028001.html
Copyright © 2020-2023  润新知