JVM作用
学过JAVA的我们都知道,JAVA语言的一大特点就是’一次编译,到处运行’,只需进行一次的编译操作即可放到任意操作系统运行,而实现这个特点的主要原因就在JVM的身上,java文件经过javac命令编译生成class字节码文件,通过java命令利用JVM生成相应操作系统的机器码即可实现在不同操作系统下运行
JVM组成结构
本地方法栈
本地方法栈中储存class文件中用native关键字修饰的非JAVA实现相关方法
栈(线程)
栈帧
用来存放方法的相关操作数据,其中(以方法add(a,b)令a+b为例):
-
局部变量表:存放相关局部变量及值,若为对象则保存地址指向堆中相关位置,例:a=1,b=2
-
操作数栈:存放待操作的值(包括赋值操作),例:1,2
-
动态链接:将指令码中’#数字’的引用指向相应方法地址(结合后面的堆和方法区理解)
-
方法出口:方法返回位置
堆
存放实例化对象,指向储存在元空间中的类元信息(类的组成部分)
元空间(方法区)
存放常量、静态变量及类的类元信息,指向计算机系统直接内存
程序计数器
记录待执行/正执行的JVM指令码行号(指令码文件可通过javap命令执行javap -c .class文件 > 输出路径,反编译查看)。
JVM执行流程
场景描述
假设我们要实现一个钱包程序,方法1为投币功能,方法2负责创建一个钱包对象将方法1投币的数量放到一个钱包中。