• JVM类加载机制



    image-20200731120844528

    类的加载过程

    类的加载过程分为加载,验证,准备,解析,初始化共5个阶段

    类的生命周期加上使用,卸载共7个阶段

    加载

    将字节码转换为二进制字节流加载到内存中,然后生成一个Class对象,用于类数据的访问

    验证

    保证字节流通过JVM规范校验和代码逻辑校验。

    准备

    为静态变量分配内存并设置初始值

    设置初始值:

    • 若使用static修饰的静态变量,初始化皆为零值
    • 若使用static final 修饰的静态变量,初始化即为代码设置的值

    解析

    将常量池中的符号引用替换成直接引用。

    初始化

    初始化的条件

    • 虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先执行该主类
    • 通过new,反射创建一个对象时,会触发类的初始化
    • 调用一个类的静态方法时会触发类的初始化(invokestatic)
    • 调用静态变量或者给静态变量赋值时会触发类的初始化(getstatic,putstatic)
    • 初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化

    初始化代码的规律:

    父类静态>子类静态>父类非静态,构造器>子类非静态,构造器

    参考这篇文章:两道面试题,带你解析Java类加载机制

    类加载器的分类

    • 启动类加载器:加载JDK核心类库,位于JAVA_HOMElib
    • 扩展类加载器:加载Java的扩展类库,位于JAVA_HOMElibext
    • 应用程序类加载器:加载程序员写的Java类

    双亲委派模型

    双亲委派模型机制:收到类的加载请求时,优先委派给父类加载器加载,如果父类无法加载,再由子类加载。故最终的加载顺序都是优先给启动类加载器加载,再由扩展类加载器加载,依次类推。

    目的:避免类的重复加载

    【举个例子】每个类都有一个共同的父类Object,每个类在被加载时都会先去加载Object类,按照双亲委派模型的思路,所有的类都会优先被启动类加载器加载,那么也就是说只需要加载一次Object,当其他类需要Object时,直接返回已经加载过的Object.class。

    image-20200731122126339

  • 相关阅读:
    PHP基础笔记之一
    乱码问题
    PHP函数
    取色工具ColorPix
    框架
    区别和详解:jQuery中的 $().each()和$.each()/jQuery.each()
    区别和详解:jQuery extend()和jQuery.fn.extend()
    H5基于iScroll实现下拉刷新,上拉加载更多....
    重要选择器querySelector和querySelectorAll
    微信对话框小三角形实现
  • 原文地址:https://www.cnblogs.com/noneplus/p/13441280.html
Copyright © 2020-2023  润新知