JVM类加载过程和类加载机制(面试回答)

1 篇文章 0 订阅
一、类加载过程

类加载到卸载过程,分为五步,加载、连接、初始化、使用、卸载。当然了,使用和卸载这两个过程是在类加载已经完成之后才开始进行的;所以说类加载过程有三步,加载、连接、初始化,而连接可分为验证、准备、解析三个细化过程。

1.加载

JVM(Java虚拟机)通过类加载器把我们源代码经过编辑器(javac)编译生成的class文件,加载到方法区内存之中的过程。通过一个类的全限定名来获取这个类的二进制流,将这个二进制流所代表的的静态存储结构转化成方法区的运行时数据区存储结构,并生成一个接口来代表这个class对象,作为这个类在方法区的各种数据访问入口。

2.验证

验证JVM所加载的类的二进制流是否符合JVM的要求,以及会不会对JVM产生安全影响。比如说验证文件格式,版本号是否在当前JVM所能加载的范围之内;元数据验证,所记载的类是否有父类(除object类)、所继承的类是否符合要求,总结起来也就是是否符合Java语义;字节码验证,变量要在使用前初始化、方法调用与对象引用类型之间要匹配,其实也就是校验字节码指令是否符合要求;符号引用校验,符号引用我觉得就是一个指向类的全限定名的指针,存在符号表中,验证符号引用是否存在问题,比如说根据符号引用找不到这个类。

3.准备

准备阶段主要是为类变量分配内存和赋初始值,这个初始值并不是真实值,而是数据类型的默认值,比如int类型的类变量,会在准备阶段赋值为0,String会赋值为null等,当然了,如果类变量有constantValues属性,也就是被final修饰的话,就会被赋真实值。

4.解析

解析阶段是虚拟机将常量池中的符号引用转换成堆内存中的直接引用。
符号引用是一组特定的符号来描述所引用的对象,就像是全限定名一样,可以唯一定位到指定的类。直接引用是可以直接指向目标对象的指针、偏移量或者是可以间接指向目标的句柄,如果有了直接引用,那么引用的目标必定存在堆内存中。
解析的主要是类和接口、字段、类方法、接口方法。

5.初始化

什么时候初始化?大概有五种情况会触发初始化,第一,虚拟机收到特定指令时,new()、getstatic、putstatic、invokestatic时;第二,通过反射调用类时,执行了invoke方法;第三、动态语言,比如使用动态代理生成类时;第四、虚拟机加载一个类时,发现其父类还未加载,则先加载其父类;第五,当虚拟机启动时,用户需要指定一个执行主类,虚拟机会先初始化这个主类。

二、类加载机制
1.类加载器

JVM预定义的三种类加载器分别是启动类加载器(bootstrap classloader)、扩展类加载器(extension classloader)、应用类加载(application classloader)。
启动类加载器是用C++ 写的二进制代码,嵌套在JVM中,随JVM启动,负责加载%jre_home%\lib下的jar、class文件。
扩展类加载器使用Java代码实现的,负责加载%jre_home%\lib\ext下的jar、class文件。
应用类加载器集成扩展类加载器,负责加载classpath下的jar、class文件。
自定义 classloader >> application classloader >> extension classloader >> bootstrap classloader

2.双亲委派模型

某个类加载收到加载一个类的请求时,首先会把这个类加载任务委托给父类,父类继续向上委托,直到bootstrap classloader为止,如果父类在指定的加载路径下可以找到所要加载的类,父类会加载这个类,并给子类返回加载的结果,子类就不会继续加载,如果父类在指定的加载路径下找到要加载的类,子类就会加载。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值