JVM整体结构
Java代码执行流程
计算机系统指令集分为栈的指令集和寄存器的指令集。
JVM是采用栈的指令集,其与硬件耦合度小,指令集小,指令多。性能逊于寄存器指令集
JVM生命周期
1、虚拟机的启动
虚拟机的启动是通过类加载器创建一个初始类实现的
2、虚拟机的执行
3、虚拟机的退出
程序正常结束
程序执行出现异常或错误
操作系统错误导致虚拟机出现错误
类加载子系统
类记载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识。
Class Loader只负责class文件的加载,至于是否可以运行由Execution Engine决定。
类加载器的三个阶段
加载阶段
1、通过类的全限定类名获取此类的二进制流
2、将字节流所代表的静态存储结构转化为方法区的运行时数据结构
3、在内存区生成一个代表这个类的 java.lang.Class对象,作为方法区这个类的各种数据的访问入口
链接阶段
1、验证
确保class文件的字节流信息符合虚拟机要求,保证被加载类的正确性
2、准备
为变量分配内存,并且设置该变量的默认初始值
这里不包含用final修饰的static,因为final在编译时就分配了
3、解析
初始化阶段
初始化阶段就是执行类构造器的方法,比如静态代码块的赋值、类构造类方法。
类加载器分类
JVM支持两种类型加载器,分别为引导类加载器,和自定义类加载器。
引导类加载器
系统mo
自定义类加载器
使用自定义类加载器场景
1、隔离加载类
2、修改类的加载方式
3、扩展加载源
4、防止源码泄露
双亲委派机制
工作原理
1、如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行
2、如果父类加载器还存在父类加载器,则进一步向上委托,一次递归,直到最顶层的加载器。
3、如果父类加载器成功加载,则返回成功。若加载失败,则让子类加载。一次递归,直到加载成功。
4、加载第三方jar包时,引导类加载器加载接口后,通过反向委托使用系统类加载器加载接口的实现类。
沙箱安全机制
如自定义String类,但是在加载自定义String类的时候会率先使用引导类加载器加载,而应到类加载器会首先加载JDK中自带的文件报错信息 为 :没有main方法,与双亲委派机制同理
其他
在JVM中表示两个class对象是否为同一个类 ,有两个必要条件
1、类的完整类名必须一致
2、加载这个类的classLoader必须一致
类的主动使用和被动使用
主动使用和被动使用区别
被动使用并不会导致类的初始化
主动使用的情况
1、创建类的实例
2、访问某个类或接口的静态变量,或者对该静态遍历赋值
3、调用类的静态方法
4、反射
5、初始化一个类的子类
6、Java虚拟机启动时被表明启动类的类