JVM学习之JVM基础知识

共 2484字,需浏览 5分钟

 ·

2020-11-27 09:21

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

  作者 |  码头工人

来源 |  urlify.cn/FRNnAr

66套java从入门到精通实战课程分享

一、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)

679c1d3b92d106843d15a1516ac31c6a.webp

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结构

336efc344cf81ae1f66d90828daff227.webp

Java代码执行流程

bdc93e39ed59cda78f10aafc4788b413.webp

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查看字节码

bb643dee8f2b00cb621ddc855c83e663.webp

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的操作数栈中
return   

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

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

e745cb25ad92b66775272b367278c593.webp

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架构下的指令集数量。




粉丝福利:实战springboot+CAS单点登录系统视频教程免费领取

???

?长按上方微信二维码 2 秒即可获取资料



感谢点赞支持下哈 160facc2b7f4719ab2a46c373bcdb23c.webp

浏览 37
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报