作为一名Java使用者,掌握JVM的体系结构也是必须的。说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成。
Java编程语言
Java类文件格式
Java虚拟机
Java应用程序接口(Java API)。
运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。
Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上。这个平台的结构如下图所示:
在Java平台的结构中, 可以看出,Java虚拟机(JVM) 处在核心的位置,是程序与底层操作系统和硬件无关的关键。
它的下方是移植接口,移植接口由两部分组成:适配器和Java操作系统, 其中依赖于平台的部分称为适配器;JVM 通过移植接口在具体的平台和操作系统上实现;在JVM 的上方是Java的基本类库和扩展类库以及它们的API, 利用Java API编写的应用程序(application) 和小程序(Java applet) 可以在任何Java平台上运行而无需考虑底层平台, 就是因为有Java虚拟机(JVM)实现了程序与操作系统的分离,从而实现了Java 的平台无关性。
JVM在它的生存周期中有一个明确的任务,那就是运行Java程序,因此当Java程序启动的时候,就产生JVM的一个实例;当程序运行结束的时候,该实例也跟着消失了。下面我们从JVM的体系结构和它的运行过程这两个方面来对它进行比较深入的研究。
1、Java虚拟机的体系结构
·每个JVM都有两种机制:
①类装载子系统:装载具有适合名称的类或接口
②执行引擎:负责执行包含在已装载的类或接口中的指令
·每个JVM都包含:
方法区、Java堆、Java栈、本地方法栈、指令计数器及其他隐含寄存器
- 类加载子系统,参考笔记类加载器
类加载器:
读取Class文件,并将其转换成虚拟机可以使用的对象,将类的信息存到方法区中
方法区:
存储加载器传递的类的信息
存放常量池信息,包括字符串和数字常量
java堆
堆的区域是线程共享的
堆得内存大小由jvm决定
存储创建的对象信息
java栈
每一个线程都有一个栈
线程创建的时候创建
保存帧空间
举例,递归中,方法每次调用自己的时候,要进行压栈操作么,
当一个新的方法压栈的时候原来的方法中还有其他地方没有运行完,
还有一些数据需要保存, 这个保存点就叫做栈帧
方法保存那些没运行的地方或者数据的节点叫做栈帧;
保存局部变量,对象地址,方法,方法参数,还有方法的调用信息
直接内存
是物理内存的映射,大小不由虚拟机分配,理论上大小无限,实际按照物理内存的大小
允许java的NIO模块直接调用
垃圾回收系统
作用在java堆,java栈,方法区中
自动化,不需要手动,会自动检测,标识,寻找无用的对象并进行回收,全程静默
本地方法栈
存放本地方法
本地方法指的是当前操作系统的api,虚拟机是需要本地系统的api才能够运行的,所以存在很多种不同的虚拟机;
pc寄存器
主要用来分辨某一个线程正在操作的方法类型,并且被虚拟机选择调用虚拟机自己的方法
如果当前线程正在执行的是本地操作系统的方法,会返回undefine
如果在操作虚拟机方法,则返回该方法
ps:虚拟机中不可能只存在一条线程,虚拟机中的线程任意状态一定是在执行方法;
执行引擎
执行引擎负责执行虚拟机的字节码,都采用 JIT (Just In Time) 即时编译,编译成机器码后再执行