JVM学习之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)

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技术体系的更多相关文章
- JVM笔记-Java技术体系与JVM概述
1. 简述 Java 不仅仅是一门编程语言,还是一个由一系列计算机软件和规范组成的技术体系. Java 的广告词为 "一次编写,到处运行",之所以能够做到"跨平台&quo ...
- JAVA技术体系发展路线
JAVA技术体系 1.1 Java程序员 ·高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变参数.可变返回类型.增强循环.静态导入 ·核心编程 IO.多线程.实体类.集合类.正则表达式.XM ...
- 简要概括java技术体系
以前一直在学java程序设计语言,学完了就以为自己已经把java学得差不多了,直到最近在看一本书<深入理解java虚拟机>,才发现自己以前学的只不过是冰山一角.相信很多小伙伴跟我一样,在没 ...
- 深入理解java虚拟机----java技术体系(一)
1.java技术体系 举例: class文件格式:如下图所示,java源代码可以根据不同的编译器可以编译成不同的代码.即可以自定义语言规范比如beanshell,并编写代码; 然后自己编写java编译 ...
- Java 技术体系(JDK 与 JRE 的关系)、POJO 与 JavaBeans
Java 技术体系的分层结构(不同的颜色表示不同的层次),尤其注意 JDK 与 JRE 之间的包含关系: 图见 Java Platform Standard Edition 7 Documentati ...
- Java技术体系 JDK与JRE
从广义上讲,Clojure.JRuby.Groovy等运行于Java虚拟机上的语言及其相关的程序都属于Java技术体系中的一员.如果仅从传统意义上来看,Sun官方所定义的Java技术体系包括以下几个组 ...
- Java技术体系图
Java程序员高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变 参数.可变返回类型.增强循环.静态导入 核心编程 ...
- Java 技术体系图
Java 程序员 高级特性 反射.泛型.注释符.自动装箱和拆箱.枚举类.可变 参数.可变返回类型.增强循环.静态导入 核心编程 IO.多线程.实体类. 集合类.正则表达式. XML 和属性文件 图形编 ...
- JVM学习--(八)java堆分析
上一节介绍了针对JVM的监控工具,包括JPS可以查看当前所有的java进程,jstack查看线程栈可以帮助你分析是否有死锁等情况,jmap可以导出java堆文件在MAT工具上进行分析等等.这些工具都非 ...
随机推荐
- Linux的安全模型
3A 资源分派: Authentication:认证,验证用户身份 Authorization:授权,不同的用户设置不同权限 Accouting|Audition:审计 当用户登录成功时,系统会自动分 ...
- Java实现:抛开jieba等工具,写HMM+维特比算法进行词性标注
一.前言:词性标注 二.经典维特比算法(Viterbi) 三.算法实现 四.完整代码 五.效果演示: 六.总结 一.前言:词性标注 词性标注(Part-Of-Speech tagging, POS t ...
- Docker学习笔记之-部署.Net Core 3.1项目到Docker容器,并使用Nginx反向代理(CentOS7)(一)
上一节演示如何安装Docker,链接:Docker学习笔记之-在CentOS中安装Docker 本节演示 将.net core 3.1 部署到docker容器当中,并使用 Nginx反向代理,部署平台 ...
- tomcat 启动失败
1.tomcat单独通过脚本可以启动,但是http://localhost:8080加载页面失败 tomcat 启动失败: a.检查JAVA_HOME和CATALINA_HOME是否配置正确:或者直接 ...
- java面试题目之JVM(YW制作仅供参考)
1.JVM工作原理 2.JVM组成部分及其作用. java虚拟机分为两个子系统和两个组件. 两个子系统分别是类加载器和执行引擎,类加载器负责加载字节码(.class)文件到JVM的内存中,执行引擎负责 ...
- ES2020链判断运算符?.和Null判断运算符??
链判断运算符 ?. 业务场景: 1 // 假设data是个数组,如果data没有值,为undefinded,则直接复制会报错,因为没有length这个属性 2 3 const dateCount = ...
- windows下安装redis集群
前几天在自己在本机win10 电脑下部署了redis集群. 主要通过的是网上两个博客: 如何在windows下部署redis集群:https://blog.csdn.net/zsg88/article ...
- JavaScript 正则表达式:字符串中查找数字
以下代码是在一段字符串中,用正则表达式找到数字,使用 replace() 方法,用找到的数字的两倍值替换原数字.replace() 方法的第二个参数为一个函数,返回找到数字的两倍值. <scri ...
- 01 . Go之Gin+Vue开发一个线上外卖应用
项目介绍 我们将开始使用Gin框架开发一个api项目,我们起名为:云餐厅.如同饿了么,美团外卖等生活服务类应用一样,云餐厅是一个线上的外卖应用,应用的用户可以在线浏览商家,商品并下单. 该项目分为客户 ...
- python数学math和random模块
math模块 关注公众号"轻松学编程"了解更多. 在使用math模块时要先导入 # 导入模块 import math 1.math.ceil(num) 对num进行向上取整 num ...