什么是jvm?
java程序自己独立运行环境,包括堆栈、寄存器和java字节码的指令集。
jvm上可以运行的语言
- Java
- Scala
- Groovy
jvm、jdk和jre
jvm:jvm是jre的一部分
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,反射调用类中的方法,子类调用初始化函数