zoukankan      html  css  js  c++  java
  • 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、回收 对象回收

        

  • 相关阅读:
    vue中的 computed 和 watch 的区别
    mysql8.0 初始化数据库及表名大小写问题
    sql server alwayson 调整数据文件路径
    zabbix 自定义监控 SQL Server
    mysql 创建用户及授权
    mysql 设置从库只读模式
    mysql8.0 主从复制安装及配置
    centos8.0安装mysql8.0
    centos8替换阿里数据源
    npm publish 报错 【you or one of your dependencies are requesting a package version that is forbidden by your security policy】
  • 原文地址:https://www.cnblogs.com/llsblog/p/10628298.html
Copyright © 2011-2022 走看看