JVM-1一类加载子系统

学习素材:尚硅谷宋红康老师视频+周志明老师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对象是否同一个类

        类的全包名必须一致;类的加载器必须相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值