1、jvm运行时数据区

image.png

方法区:
一个进程内所有线程共享的内存区域,主要存放一些类变量、常量、静态变量、即时编译后的代码及数据。
堆:
是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例。
程序计数器:
保存当前线程所正在执行的字节码指令的地址(行号),每个线程都有其自身的程序计数器,使在切换线程之后都能回到正确的位置。
本地方法栈:
本地方法栈是为虚拟机执行所使用到的native Java方法(也就是字节码)服务
虚拟机栈:
虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
method A—创建栈帧(Stack frame)1——保存方法中的局部变量表、操作数栈、动态连接、方法出口等.
method B—创建栈帧(Stack frame)2——保存方法中的局部变量表、操作数栈、动态连接、方法出口等.
栈帧的解析:
1、局部变量表:主要存储我们定义的局部变量,存储8个基本数据类型、对象引用的地址、returnAddress类型(retrun后要执行的字节码的指令地址)。
2、操作数栈:读取需要操作的代码,进行执行计算并返回给对应的局部变量表
3、动态链接:主要存储调用其他方法的链接,例如a.add()方法,要链接到其它地方去。
4、方法出口:存储return返回的值。

2、java文件运行过程

编写一个java源文件(.java)——字节码编译器编译成一个jvm文件(.class)——进入类加载子系统(将字节码文件加载到内存中)
——字节码检验器—JVM中的执行引擎找到入口方法main(),执行其中的方法。
image.png