类的加载机制

1、类的加载

1. 装载类的第一阶段
2. 获取类的二进制流
    2.1 从本地系统中直接加载
    2.2 通过网络下载.class文件
    2.3 从zip,jar等归档文件中加载.class文件
    2.4 从专有数据库中提取.class文件
    2.5 将Java源文件动态编译为.class文件
3. 转为方法区的数据结构
4. 在java堆中生成java.long.Class对象

2、链接

  • 2.1 验证
 1. 文件格式验证
    1.1 是否以0xCAFEBABE开头
    1.2 版本号是否合理
    1.3 常量池中的常量是否有不被支持的类型
 2. 元数据验证【简单的说就是java中基本的语法和语义是否符合规范】
    2.1 是否有父类
    2.2 继承了final类
    2.3 非抽象类是否实现了所有的抽象方法
 3. 字节码验证【很复杂 我也不是很懂 ╮( ̄▽ ̄)╭ 】
    3.1 运行检查
    3.2 栈数据类型和操作码数据参数吻合
    3.3 跳转指令到合理的位置
 4. 符号引用验证
    4.1 常量池中描述类是否存在
    4.2 访问的方法或者字段是否具有足够的权限【public、protected、private】
  • 2.2 准备
 1. 分配内存,并为类设置初始值(方法区中)
 2. public static int v =1;
 3. 在准备阶段中,v会被值为0;
 4. 在初始化的<clinit>中才会被值为1;
 5. 对于static final类型,在准备阶段就就会被赋上正确的值
 6. public static final int v =1;
  • 2.3 解析
  1. 将符号引用替换直接引用;
  2. 什么是符号引用
    2.1 符号引用就是字符串 假设我有一个User类默认超类就是java.lang.Object 那么它在class的常量池中有个字符串 字符串就是"java.lang.Object"
    2.2 直接引用就是指针和地址偏移量

3. 初始化

1. 执行类构造器<clinit>
    1.1 变量 赋值语句
    1.2 static{}语句会被执行
2. 子类的<clinit>调用前保证父类的<clinit>被调用
3. <clinit>是线程安全的;

4.ClassLoader

  • 4.1 什么是类装载器ClassLoader
 1. ClassLoader是一个抽象类
 2. ClassLoader的实例将读入Java字节码将类装载到JVM中
 3. ClassLoader可以定制,满足不同字节码流获取方式
 4. ClassLoader负责类装载过程中的加载阶段
  • 4.2 ClassLoader的种类
 1. BootStrap ClassLoader (启动ClassLoader)
 2. Extension ClassLoader (扩展ClassLoader)
 3. App ClassLoader (应用ClassLoader/系统ClassLoader)
 4. Custom ClassLoader(自定义ClassLoader)

5.双亲委托机制

  • 5.1 双亲委托机制图解


    image.png
  • 5.2 双亲委托机制源码解析

 1. 检查类是否已被加载过,调用 findClassLoaded() 查看当前类加载器是否存在 class 的缓存
 2. 若类未被加载过,递归委托父类加载器调用 loadClass() 加载类,若无,则 findBootstrapClassOrNull() 完成类加载
 3. 若以上步骤都不能完成类加载,则调用 findClass() 尝试当前类加载器完成加载,若加载成功则缓存
protected Class<?> loadClass(String name, boolean resolve)
       throws ClassNotFoundException
   {
       synchronized (getClassLoadingLock(name)) {
           // 检查类是否已被加载过
           Class<?> c = findLoadedClass(name);
           if (c == null) {
               long t0 = System.nanoTime();
               try {
                   if (parent != null) {
                     //递归委托父类加载器加载类
                       c = parent.loadClass(name, false);
                   } else {
                     //无父类加载器,则调用启动类加载器加载
                       c = findBootstrapClassOrNull(name);
                   }
               } catch (ClassNotFoundException e) {
                   // ClassNotFoundException thrown if class not found
                   // from the non-null parent class loader
               }

               if (c == null) {
                   long t1 = System.nanoTime();
                  //递归委托后仍然无法完成类加载,则使用当前类加载器加载
                   c = findClass(name);

                   // this is the defining class loader; record the stats
                   sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                   sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                   sun.misc.PerfCounter.getFindClasses().increment();
               }
           }
           if (resolve) {
               resolveClass(c);
           }
           return c;
       }
   }
  • 5.3 双亲委托机制意义
 1. Class的唯一性【同一个加载器加载同一份class文件】
 2. 保证Java程序安全稳定运行
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容