什么是jvm?
java程序本身独立运行环境,包括堆栈、寄存器和java字节码的指令集。java
jvm上能够运行的语言
jvm、jdk和jre
jvm:jvm是jre的一部分jvm
jre:java运行环境,包含jvm函数
jdk:包含工具
- jre
- jvm
- 经常使用的一些开发工具,javac、java和jconsol等等
生命周期
main方法是jvm实例运行的起点,main做为程序初始线程的起点,任何其余线程都由该线程负责启动,main线程是非守护线程。开发工具
jvm实例消亡的方法:线程
- 全部的非守护线程都终止时
- System.exit()
组成
- 类加载器子系统(class loader)
- 执行引擎子系统
- 运行时数据区(runtime data area)
- Native接口
运行流程
- 首先将java源代码经过javac指令编译成字节码文件
- 字节码文件经过class loader进行加载
- 将类的权限修饰、类名、成员变量修饰、成员变量、方法修饰、方法参数和方法返回值等等放入运行时数据区的方法区;将new出来的对象放入堆中,类的静态变量放入堆的常量池中;将对象索引放入VM栈里;调用本地方法放入本地方法栈;PC寄存器根据线程数分配,用于存放代码读取行数。
- 执行引擎根据运行时数据区调用本地库接口和本地方法库
Class loader
负责加载字节码到jvm中,根据类中定义的内容分配到不一样的运行时数据区对象
分类:
- Bootstrap ClassLoader:classLoader的根,rt.jar
- Extension ClassLoader
- Application ClassLoader
- 用户自定义类加载器
加载过程:
- 加载 负责找到class文件,并加载到jvm中
- 链接
- 校验 确保类的格式正确
- 准备 为类中的变量分配内存空间,并初始化默认值
- 解析 符号引用转换为直接引用
- 初始化 执行静态代码块,构造器,静态属性,在调用new,反射调用类中的方法,子类调用初始化函数