zoukankan      html  css  js  c++  java
  • 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架构下的指令集数量。



  • 相关阅读:
    Eclipse / android studio 添加第三方jar包 步骤
    Android checkbox 自定义点击效果
    Android 程序打包和安装过程
    Android 基础
    (转)Genymotion安装virtual device的“unable to create virtual device, Server returned Http status code 0”的解决方法
    (转)eclipse 导入Android 项目 步骤
    微信开放平台注册 步骤
    Android Studio 初级安装
    数组
    作用域问题代码
  • 原文地址:https://www.cnblogs.com/boycelee/p/14028001.html
Copyright © 2011-2022 走看看