【2019秋冬】【JVM】深入理解Java虚拟机 第七章

类加载机制:把描述类的文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型

过程:加载,连接(验证,准备,解析),初始化,使用,卸载
解析和初始化可以换顺序,解析在初始化后为动态绑定
按顺序开始,不一定按顺序结束

加载
完成三个步骤(自我理解)
1.通过类的名字来获取class文件
2.把class文件放入方法区
3.生成一个代表该类的class对象,方便别人引用

验证
确保class文件的字节流中包含的信息安全,因为class文件不一定都是Java编写的
文字格式检验;元数据检验;字节码检验;符号引用检验;

准备
为类变量分配内存,并设置变量初始值,在方法区中分配
不是实例变量,只是类变量,工具人

解析
将常量池内的符号引用替换为直接引用
符号引用:只要能无歧义的定位到目标即可,一组符号(无规律唯一符号)
直接引用:能直接定位到目标的指针,偏移量等,与内存相关(有规律符号)

初始化
有且只有五种情况必须立即初始化
1)遇到new,getstatic,putstatic,invokeestatic时,如果类没有初始化过,要先初始化(实例化对象,读取或设置一个类的静态字段,调用静态方法)
2)对类反射调用时,如果类没有初始化,要初始化
3)初始化该类,其父类还没初始化,要先初始化父类
4)JVM启动时,需要执行主类(main),先初始化
5)某方法句柄所对应类没初始化,要初始化
初始化阶段根据程序员设定的值赋值;或者说初始化阶段是执行 < clinit >()方法的过程
clinit方法是有编译器自动收集类的 类变量的赋值动作 和 静态块的语句,收集顺序是语句顺序
静态块中只能访问静态块前的变量,静态块后的变量只能赋值不能访问

类加载器
通过一个类的名字来获取其二进制字节流
判断两个类相等,前提是都由相同的类加载器加载

Java程序三种类加载器
启动类加载器(C++编写);扩展类加载器;应用程序类加载器

双亲委派模型(图略)
当一个类加载器收到加载请求时,会优先让自己的父类完成,如果父类无法完成,再自己完成
优点:稳定,有层级性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值