• JVM系列3:类加载机制


      了解类加载机制也是深入了解Java的重要一环,它包括加载过程、类加载器、加载机制等内容。

      以下是我总结的思维导图。

    类加载

      首先讲讲类加载的时机,以下是会触发类加载的时机:

      1、new、get/put/invoke+static  new 一个类,或访问它的静态方法或常量时。

      2、reflect包的方法

      3、初始化一个类,其父类需初始化

      4、main函数类

      5、MethodHandle实例最后的解析结果REF_get/put/invoke方法

      

      类加载器及类加载机制  

      Java中有3种类加载器,1、Bootstrap ClassLoader启动类加载器,它负责加载Java一些根基类,加载JAVA根目录/lib.

                  2、Extension ClassLoader扩展类加载器,加载Java根目录/lib/ext里的类。

                 3、Application ClassLoader应用程序类加载器,加载用户类路径下的包。

      Java类加载机制是采用双亲委派加载机制或者说多层级父类加载机制。如下:

      每个加载器接受到加载请求都会传递给上级,直到上级无法处理才会传回给自己加载。这么做的目的是保证基础类一致性,保证类基础性行为。

      比如当我们判断两个对象是否相同,它的前提就是它们由同一个类加载器加载,否则这些比较毫无意义了。

      双亲委派机制并不是强制的,实际上也出现了破坏双亲委派的加载机制如JNDI(父级请求子级)、热部署热替换(网状结构)。具体内容以后研究。

      类加载过程

      Java类加载过程分为七步:

      1、加载  a、通过类的全限定名获取此类二进制字节流(类加载器加载)

          b、将字节流代表的静态存储结构转化为方法区运行时数据结构

          c、在内存中生成一个代表该类的对象,作为方法区该类的数据访问入口

      2、验证 验证类的数据格式、安全性等。

      3、准备 正式为类变量分配内存并设置类变量初始值(在方法区),初始值是各static修饰类变量的0值,如int初始为0,boolean初始为false,如果是static final修饰的直接赋予给定值。

      4、解析 将常量池内的符号引用替换为直接引用(实际内存地址)的过程

      5、初始化  执行类构造器<clinit>()方法的过程,就是收集并执行所有类变量赋值动作和静态语句块。(new对象时,类初始化完,还会执行成员变量赋值及实例语句块以及构造方法<intit>)

      6、使用 对象使用

      7、回收 对象回收

        

  • 相关阅读:
    C#多线程学习笔记(三)——线程池
    html解析工具
    怎么样获取手机的主题
    我改进的《豆瓣搜》前后对比及源代码
    【收藏】Silverlight Style (二) 自定义样式在后台代码中应用
    C#多线程学习笔记(一)
    学习Linux——学习正确的思考方式(转)
    电信禁路由上网的破解方法
    印度软件业
    中国与印度软件工程师之比较
  • 原文地址:https://www.cnblogs.com/llsblog/p/10628298.html
Copyright © 2020-2023  润新知