zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    MySQL
    用python自动复制粘贴excel表里某一列的数据到另一个表中
    python操作excel小试牛刀
    python- 安装扩展包
    15分钟用ppt制作桌面整理四格壁纸
    R-算术运算符
    R-变量
    R-函数/语法-整合版
    MySQL-函数-整合版
    Python_图片对比问题汇总
  • 原文地址:https://www.cnblogs.com/noneplus/p/13441280.html
Copyright © 2011-2022 走看看