zoukankan      html  css  js  c++  java
  • java面试一日一题:java的类加载过程

    问题:请讲下java的类加载机制及过程

    分析:该问题主要考察对JVM加载类的机制及过程,延申出的问题是为什么使用双亲委托模型,有什么办法可以打破双亲委托吗;

    回答要点:

    主要从以下几点去考虑,

    1、类加载的过程?

    2、类加载的机制?

    3、如何打破双亲委托模型?

    在运行java程序时,一个类必须要加载到内存中才可以被使用,那么这个加载的过程是什么样子的那

    类加载的过程分为下面三个阶段

    加载

    所谓加载,就是把字节码文件(java编译器会把源文件编译为字节码文件)加载到JVM中,并且映射为JVM可以识别的数据结构,也就是Class对象;字节码的来源可以是网络、数据库、jar等格式,这个过程是用户可以参与的过程,可以自定义类加载器实现加载的过程;

    连接

    这一步是核心的过程,要把上个阶段的Class文件,转化为JVM运行时的数据结构,分为三个步骤,验证、准备、解析;

    验证

    验证主要是验证字节码是否符合JVM虚拟机的规范,主要从安全方面进行考虑。

    准备

    准备阶段主要是针对类或接口中的静态变量,对类变量进行创建并赋初值,这里的初值是对应的类型的默认值;

    解析

    将符号引用转化为直接引用

    初始化

    执行类初始化的操作,包括静态变量的赋值,静态代码块的执行等;

    上面说了类加载的过程,那么一个类加载的机制是什么那

    java中类加载遵循双亲委托模型。类加载首先要有类加载器,java提供了3种类加载器,bootstrapClassLoader、ExtClassLoader、ApplicationClassLoader,其中bootstrapClassLoader没有父加载器。一个类被加载时,默认情况下会使用ApplicationClassLoader进行加载,ApplicationClassLoader会查找自己的缓存,如果换成中没加载过该类,则会委托给其父类加载器ExtClassLoader去加载,ExtClassLoader同样去查找自己的缓存,如果缓存中没有则委托给其父类BoostrapClassLoader去加载,BootstrapClassLoader查找自己的缓存,如果缓存中没有,则它会尝试自己去加载(它没有父加载器),如果它加载不了,则交给ExtClassLoader去加载,ExtClassLoader无法加载的话,就会交给ApplicaitonClassLoader去加载,如果都加载不了的话则会抛出异常。

    使用双亲委托的好处就是防止类被重复加载,保证一个类只能由一个类加载器加载;保证JDK类库的安全;

    如何打破双亲委托那

    1、可以自定义类加载器,继承抽象类ClassLoader,重写其loadClass方法,该方法中实现的就是双亲委托的代码;同时要重写因为该方法是一个抽象方法,需要定义该类从什么地方加载字节码;

    2、SPI机制,service provider interface 是一套接口,这套接口由java来提供,但是具体实现由第三方来提供,例如,java.sql包就定义了一组数据库访问规范,但是并没有提供具体的实现,具体的实现由各数据库厂商提供;

    一个爱写文章的程序员,欢迎关注我的公众号“北漂程序员”。我有故事,你有酒吗
  • 相关阅读:
    配置nova服务使用ceph作为后端存储
    配置glance使用ceph作为后端存储
    配置nova-compute在不同的hypervisors上使用不同的存储后端
    配置cinder-backup服务使用ceph作为后端存储
    配置cinder-volume服务使用ceph作为后端存储
    安装cinder
    利用ceph-deploy安装ceph
    安装neutron
    安装nova
    安装glance
  • 原文地址:https://www.cnblogs.com/teach/p/14615926.html
Copyright © 2011-2022 走看看