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

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 classfile format. Aclass file contains Java Virtual Machine instructions (or *bytecodes*) and a symbol table, as well as other ancillary information.

(2)中文解释

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

JVM结构

Java代码执行流程

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

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下的汇编指令

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

JVM学习之Java技术体系的更多相关文章

  1. JVM笔记-Java技术体系与JVM概述

    1. 简述 Java 不仅仅是一门编程语言,还是一个由一系列计算机软件和规范组成的技术体系. Java 的广告词为 "一次编写,到处运行",之所以能够做到"跨平台&quo ...

  2. JAVA技术体系发展路线

    JAVA技术体系 1.1 Java程序员 ·高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变参数.可变返回类型.增强循环.静态导入 ·核心编程 IO.多线程.实体类.集合类.正则表达式.XM ...

  3. 简要概括java技术体系

    以前一直在学java程序设计语言,学完了就以为自己已经把java学得差不多了,直到最近在看一本书<深入理解java虚拟机>,才发现自己以前学的只不过是冰山一角.相信很多小伙伴跟我一样,在没 ...

  4. 深入理解java虚拟机----java技术体系(一)

    1.java技术体系 举例: class文件格式:如下图所示,java源代码可以根据不同的编译器可以编译成不同的代码.即可以自定义语言规范比如beanshell,并编写代码; 然后自己编写java编译 ...

  5. Java 技术体系(JDK 与 JRE 的关系)、POJO 与 JavaBeans

    Java 技术体系的分层结构(不同的颜色表示不同的层次),尤其注意 JDK 与 JRE 之间的包含关系: 图见 Java Platform Standard Edition 7 Documentati ...

  6. Java技术体系 JDK与JRE

    从广义上讲,Clojure.JRuby.Groovy等运行于Java虚拟机上的语言及其相关的程序都属于Java技术体系中的一员.如果仅从传统意义上来看,Sun官方所定义的Java技术体系包括以下几个组 ...

  7. Java技术体系图

    Java程序员高级特性              反射.泛型.注释符.自动装箱和拆箱.枚举类.可变              参数.可变返回类型.增强循环.静态导入        核心编程       ...

  8. Java 技术体系图

    Java 程序员 高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变 参数.可变返回类型.增强循环.静态导入 核心编程 IO.多线程.实体类. 集合类.正则表达式. XML 和属性文件 图形编 ...

  9. JVM学习--(八)java堆分析

    上一节介绍了针对JVM的监控工具,包括JPS可以查看当前所有的java进程,jstack查看线程栈可以帮助你分析是否有死锁等情况,jmap可以导出java堆文件在MAT工具上进行分析等等.这些工具都非 ...

随机推荐

  1. 忘记MySQL密码怎么办?一招教你搞定!

    在安装完 MySQL 或者是在使用 MySQL 时,最尴尬的就是忘记密码了,墨菲定律也告诉我们,如果一件事有可能出错,那么它一定会出错.那如果我们不小心忘记了 MySQL 的密码,该如何处理呢?别着急 ...

  2. C# 获取两点(经纬度表示)间的距离

    #region 获取两点(经纬度表示)间的距离 /// <summary> /// 获取两点(经纬度表示)间的距离 /// </summary> /// <param n ...

  3. matlab cvx工具箱解决线性优化问题

    题目来源:数学建模算法与应用第二版(司守奎)第一章习题1.4 题目说明 作者在答案中已经说明,求解上述线性规划模型时,尽量用Lingo软件,如果使用Matlab软件求解,需要做变量替换,把二维决策变量 ...

  4. JS实现将二维数组生成到页面上

    前言 之前没说过数组,现在来写一下数组 CSS span { border:2px solid skyblue; width:30px; height: 30px; display: inline-b ...

  5. django—视图相关

    FBV与CBV FBV:function based view   基于函数的视图 CBV:class based view  基于类的视图 CBV的定义: from django.views imp ...

  6. 一篇文章 图解Python 玩转Python

    0 Python 解释器:1.Python数据结构:2.变量与运算符3 Python 流程控制 4 Python 文件处理5 python 输入输出6 Python 异常7 Python 函数和模块8 ...

  7. 循序渐进VUE+Element 前端应用开发(23)--- 基于ABP实现前后端的附件上传,图片或者附件展示管理

    在我们一般系统中,往往都会涉及到附件的处理,有时候附件是图片文件,有时候是Excel.Word等文件,一般也就是可以分为图片附件和其他附件了,图片附件可以进行裁剪管理.多个图片上传管理,及图片预览操作 ...

  8. Flink1.9.2源码编译和使用

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. 个人笔记docker

    启动docker sudo systemctl start docker.service   暂停docker sudo systemctl stop docker.service   运行docke ...

  10. [NOIP 2016D2T2/Luogu P1600] 天天爱跑步 (LCA+差分)

    待填坑 Code //Luogu P1600 天天爱跑步 //Apr,4th,2018 //树上差分+LCA #include<iostream> #include<cstdio&g ...