学习素材:尚硅谷宋红康老师视频+周志明老师Jvm书籍
一、Jvm基础
1.简述
Jvm是二进制字节码的运行环境,负责装载字节码到其内部,解释、编译为对应的机器指令执行。java虚拟机具有语言无关性,并非与Java"终身绑定",只关心字节码文件是否符合Jvm规范。
2. java代码执行流程
java文件===》前端编译器(词法分析、语法分析、语义分析、字节码生成器)===》生成字节码class文件===》类加载器(加载、链接、初始化)===》运行时数据区===》执行引擎 翻译字节码、编译执行,将字节码指令翻译为机器语言
3.Jvm架构模型
一共两种模型:一种基于栈式的指令集架构,一种基于寄存器架构。基于栈式的使用零地址指令,指令集更小(但指令集更多),不受限于硬件资源;基于寄存器架构的模型完全依赖硬件、不同平台CPU架构不同,可移植性差。因此一般使用基于栈式的。
二、 类加载子系统
类加载器 Class Loader作用:将.class文件加载到Jvm中,生成元数据模板,根据模板可以实例出n个一模一样的实例。
1.加载
将class文件,通过其全限定名获取文件的二进制字节流加载到运行时数据区,生成class对象。
2.链接
验证:检验class文件字节流的安全性,是否符合虚拟机的要求。
准备: 为类变量分配内存并设置该类变量为零值 不包括final修饰的static变量 因为在编译的时候就分配了,准备阶段会显示的初始化;不会为实例变量分配初始化,类变量分配在方法区 而实例变量随着对象一起分配到堆中。
解析:将常量池内的符号引用转换为直接引用
3.初始化
执行类的方法,此方法是执行static静态代码块 以及对类的静态变量赋值,如果不存在static代码块和静态变量 则此方法不存在。若该类具有父类,则会先执行父类的方法。
4.类加载器分类
常见的有3种。启动类加载器(引导类加载器 Bootstrap ClassLoader),由C/C++语言实现,嵌套在Jvm内部,加载Java的核心库,只加载包名为java、javax、sun等开头的类,没有父类加载器;扩展类加载器,父类加载器为启动类加载器,加载jre/lib/ext子目录下的jar;应用程序类加载器,父类为扩展类加载器,java应用的类都是由它加载。
5.双亲委派机制
如果一个类加载器收到了类加载的请求,会交由其父类的加载器加载,如果父类加载器还存在父类,则进一步向上委托。如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子类加载器才会尝试自己去加载。
作用:避免类的重复加载;防止核心API被随意篡改 如自定义java.lang.String就会先使用引导类加载器加载jdk自带的文件,报错没有main方法。
6.判断class对象是否同一个类
类的全包名必须一致;类的加载器必须相同