每个JVM都是一个独立的进程。
由ClassLoader将Java的字节码文件加载到JVM中
1、每启动一个程序就启动了一个JVM,程序运行结束JVM就消亡。
JVM退出的几种场景:1、调用System.exit();
2、程序运行结束
3、程序遇到异常或者错误,如果main方法会将异常抛出给虚拟机
4、操作系统终止JVM
类的加载、连接、初始化。
1、加载:查找并加载类的二进制数据。
类的加载指的是将.class文件的二进制数据读入到内存当中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区的数据结构。同一个类的所有对象,只对应一个Class对象。Class类时整个反射机制的入口
2、连接:
验证:确保被加载类的正确性
准备:为类的静态变量分配内存、并将其初始化为默认值
解析:把类的符号引用转变为直接引用
3、初始化:为类的静态变量赋予正确的初始值。
Java程序对类的使用分为两种:主动使用和被动使用
主动使用:(1)创建类的实例(2)访问某个类或者接口的静态变量(3)调用类的静态方法
(4)反射:Class.forName();(5)初始化一个类的子类,可以看做是对父类的主动使用。
(6)Java虚拟机启动时被标明为启动类的类:包含main方法的类或者一个Java程序启动的入口
方法区存储的是Java类的数据结构,堆区存储的是类的实例对象。
类加载器分为两种:
(1)启动类的加载器:BootStrap/Extention/System
如果某个类的getClassLoder方法返回null,则说明该类是由根类加载器加载的。
(2)自定义类的加载器:ClassLoader
当被装载的类引用了其他的类的时候,虚拟机就会用装载第一个类的装载器来装载其他被引用的类。运行时Java程序中的每一个类都有他自己的命名空间。
Java虚拟机中的线程分为两类:守护线程和非守护线程。守护线程通常是由Java虚拟机自己使用的,比如执行垃圾回收任务的线程;Java程序也可以把它创建的线程标记为守护线程,Java程序中的初始线程(开始于main方法的线程)就是一个非守护线程。
Java程序初始类中的main方法,将作为程序初始线程的起点,程序中任何其他线程都是由该线程启动。
只要有任何非守护线程还在运行,则Java程序就还在运行,当所有的非守护线程结束时,Java程序也自动结束。
Java虚拟机的组成部分:类装载器,执行引擎,运行时数据区(方法区、堆区、栈区、PC寄存器、本地方法区)、本地方法接口。