一、JVM体系结构
JVM体系结构分为4部分
类加载器、执行引擎、内存区、本地方法调用
1. 类加载器:在JVM启动时,负责加载class文件到JVM中
类加载器将在分析Classloader中详细介绍
2.执行引擎:负责执行class文件中的字节码,相当于计算机的cpu
执行引擎是JVM的核心部分,它负责解析JVM字节码指令并得到执行的结果,Java虚拟机规范中定义了遇到字节码指令时应该处理什么,并且应该得到什么结果,但具体的执行方式并没有定义,而是由JVM厂家自己去实现。每
执行引擎就是执行一条条代码的一个流程,也就是执行一个个java方法的流程。实际上,每个java线程就是一个执行引擎的实例
3.内存区: 将内存划分成多个区,模拟实际机器中的存储、记录、调度功能模块
在JVM执行过程中需要保存一些信息,如操作码的操作数、执行的返回结果等,还有class类的字节码等信息都要在JVM执行前就准备好。这些数据都是存储在内存区。
JVM内存区分为:方法、java堆、java栈、PC寄存器和本地方法区。方法去和java堆是线程共享的。而Java栈和PC寄存器是在每个执行引擎实例(即线程)创建时单独分配的,是线程间不共享的,java栈中保存的是方法的参数、变量、返回值等信息,PC寄存器是指向即将执行的吓一条指令的指针。
4.本地方法调用:调用C、C++实现的本地方法的代码返回结果
二、JVM工作机制
1.JVM为何要基于栈的架构
JVM执行字节码指令是基于栈的架构,所有操作数都要先入栈
理由:1、JVM要设计成与平台无关的,即在有很少或没有寄存器的机器上也能正常执行
2、为了指令的紧凑性。因为java的字节码有可能在网络上传输,会节省空间
2.执行引擎的架构设计
每当创建一个新线程时,JVM会为这个线程创建一个Java栈和一个PC寄存器,并且寄存器会指向这个线程的第一行可执行代码。
每当访问一个新方法时,会在栈中创建一个新的栈帧数据结构,这个栈帧会保留这个方法的一些元信息。