jvm类加载机制

  类加载机制就是jvm将class文件读取到内存中,对数据进行校验,转换解析和初始化。最终形成可以被虚拟机直接使用的java类型

类加载的生命周期大概包括了七个阶段:

加载:①通过一个类的全限定名来获得定义此类的二进制字节流,②将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。③在java堆中生成一个代表这个类的java.lang.Class对象,作为方法区这些数据的访问入口。   加载完成之后二进制字节流就按照虚拟机所需的格式存储在方法区中。

验证:验证的目的是为了确保Class文件中的字节包含的信息符合当前虚拟机的要求,而且不会危害虚拟机自身的安全,大概包括:文件格式的验证(验证字节流是否符合Class文件格式的规范,还能被当前虚拟机处理,为了保证输入的字节流能正确的解析并存储于方法区内),

元数据的验证(对类中额各种数据类型进行语法校验),

字节码的验证(对数据流和控制流分析,对类的方法体进行校验分析,保证被校验的类的方法在运行时不会做出危害虚拟机安全的行为)

符号引用的验证(发生在虚拟机将符号转化为直接引用的时候,对常量池中的各种符号引用进行匹配性的校验)。

准备:正式为变量分配内存并设置初始值,这些内存都将在方法区中进行分配,but这是进行内存分配的仅包括类变量(static修饰),设置初始值都是赋予的java类型的默认零值。

解析:虚拟机将常量池内的符号引用替换为直接引用的过程。比如A类中的方法引用了B类中的b方法,那么他会找到B类的b方法的内存地址,将符号引用替换为直接引用(内存地址)。

初始化:开始执行类中定义的java代码,为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要对类变量进行初始化,是执行类构造器<client>方法的过程。

使用,卸载。其中验证 准备 解析三个部分统称为连接。

java自带三种类加载器:BootStrap:加载核心类库,ExtClassLoader扩展类加载器,AppClassloader也称SystemAppClass 加载当前应用的classpath的所有类。

双亲委派机制:双亲委派模型要求除了顶层启动类加载器外其余加载器都应该有自己的父类加载器,类加载器之间通过复用关系来复用父类加载器的代码。Application ClassLoader收到一个类加载请求时,他不会自己去加载,而是将这个请求委派给父类Extension ClassLoader去完成,当Extension ClassLoader收到类加载请求时,也会委派给它的父类Bootstrap ClassLoader,如果Bootstrap ClassLoader加载失败(在<JAVA_HOME>\bin中未找到所需的类),就会让Extension ClassLoader尝试加载,如果Extension ClassLoader加载失败就让APplication ClassLoader 加载,Application ClassLoade加载失败就让自定义类加载,都失败了抛出ClassNotFindException异常。其实现过程:实现双亲委派模型的代码都集中在java.lang.ClassLoader的loadClass()方法中,首先会检查请求加载的类是否被加载过,若没有递归调用父类的LoadClass();如刚才所说的机制。委派的机制意义:比如要加载线程中的类A,A中引用了B,虚拟机将使用加载类A的加载器去加载B,类B再使用的时候如果发现类B已经加载了,就不要去加载这个类B了。避免了类的重复加载。

 

还有个破坏双亲委派机制的看了下没看懂,再琢磨琢磨在写!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值