1 JVM在java平台中的位置
1.1 Java平台组成
Java平台主要由Java虚拟机和Java API这两部分组成。参考Oracle官网。
1.2 java平台结构图
JDK1.2开始,迫于Java运行始终笔C++慢的压力,JVM的结构也慢慢发生了一些变化,JVM在某些场景下可以操作一定的硬件平台,一些核心的Java库甚至也可以操作底层的硬件平台,从而大大提升了Java的执行效率。JDK1.2之后的整个java平台如下图所示:
1.3 JVM与JRE、JDK的关系
参照Oracle官网的介绍可知,JVM与JRE、JDK的关系如下:
JVM:负责执行符合规范的Class文件。
JRE:包含JVM与类库。
JDK:包含JRE与一些开发工具,如javac、javap等。
1.4 java虚拟机在整个程序流程中的位置
2 JVM的体系结构
2.1 什么是虚拟机
模拟执行某种指令集体系绌构的软件。有多种分类,比如进程虚拟机(高级语言虚拟机),系统虚拟机,协设计虚拟机。
2.2什么是Java虚拟机
(1)有多层含义:
- 一套规范:Java虚拟机规范,定义概念上Java虚拟机的行为表现。
- 一种实现:例如HotSpot、J9、JRockit。需要实现JVM规范,但具体实现方式不需要与“概念中”的JVM一样。
- 一个运行中的实例:某个JVM实现的某次运行的实例。
(2)只要输入符合规范的Class文件即可执行。
(3)并非一定要执行“Java”程序,可以支持其他语言,比如Groovy,Jython等。
2.3 概念中JVM体系结构
2.4 JVM的内部体系结构分为三部分
(1)类装载器(ClassLoader)子系统
作用:用来装载.class文件。
(2)执行引擎
作用:执行字节码,或者执行本地方法。
(3)运行时数据区
方法区,堆,java栈,PC寄存器,本地方法栈。
3 JVM的生命周期
3.1 两个概念:JVM实例和JVM执行引擎实例
(1)JVM实例对应了一个独立运行的java程序,它是进程级别。
(2)JVM执行引擎实例则对应了属于用户运行程序的线程,它是线程级别的。
3.2 JVM的生命周期
(1)JVM实例的诞生
当启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点。
(2)JVM实例的运行
main()作为该程序初始线程的起点,任何其他线程均由该线程启动。
JVM内部有两种线程:守护线程和非守护线程,main()属于非守护线程,守护线程通常由JVM自己使用,java程序也可以标明自己创建的线程是守护线程。
(3)JVM实例的消亡
当程序中的所有非守护线程都终止时,JVM才退出;若安全管理器允许,程序也可以使用Runtime类或者System.exit()来退出。
4 Class文件
4.1 Class文件所记录的信息
(1)结构信息
- Class文件格式版本号
- 各部分的数量与大小
(2)元数据
- 类/ 继承的超类/ 实现的接口的声明信息
- 域与方法声明信息
- 常量池
- 用户自定义的、RetentionPolicy为CLASS或RUNTIME的注解
- ——对应Java源代码中“声明”与“常量”对应的信息
(3)方法信息
- 字节码
- 异常处理器表
- 操作数栈与局部变量区大小
- 操作数栈的类型记录(StackMapTable,Java 6开始)
- 调试用符号信息(如LineNumberTable、LocalVariableTable)
- ——对应Java源代码中“语句“与“表达式”对应的信息
4.2 class文件不只是字节码
字节码只代表程序逻辑,只是Class文件众多组成部分其中之一。
参考资料
莫枢JVM技术分享PPT。
淘宝应届生培训 JVM工作原理PPT。
http://yhjhappy234.blog.163.com/blog/static/3163283220122204355694/