废话不多说,直接上干货! --关山云影
JVM俗称java虚拟机,是java能够实现跨平台的关键。
JVM五大模块:
1>类装载子系统
2>运行时数据区
3>字节码执行引擎
4>本地方法接口
5>垃圾回收模块
下面是一个类从加载到执行完成的流程图:
一个类被java 编译器编译乘.class文件,通过类装载子系统load进运行时数据区,由字节码执行引擎去负责执行这个类:
1、首先在栈(又称java虚拟机栈)中开辟一块空间,用来存放线程执行时的临时数据。
2、每个方法执行时jvm 都会创建一个栈帧,这个栈帧就时用来临时存放线程所需要的局部变量表、操作数栈、动态连接、方法出口。栈帧就在1中开辟的空间中,如果一个类中存在多个线程,那么,就会临时创建相同数目的栈帧。
3、局部变量表用来存放方法中涉及到的局部变量,操作数栈时一个用来计算的临时数据存储区(比如int a = 1; int b = 2; int c = a+b 结合jvm 指令手册,1、2、a+b 都会被先装载到操作数栈,然后根据先进后出的原则弹出来计算,然后将结果赋值给相应的局部变量)。
4、创建对象时在堆中存储该对象的具体信息,并将其地址的引用赋值给栈中的代表该对象的变量。
5、jvm按照编译的字节码文件一步步执行,该创建对象就创建对象,该调用方法就调用方法,该计算就计算,动态链接其实就是存储了要调用的方法的一个直接引用。
6、方法被执行完成之后,都会返回一个方法被调用的位置,程序才能继续执行。方法返回时可能需要在当前栈帧中保存一些信息,用来帮助它恢复上层方法执行的状态