JVM学习-类加载和类加载器

Posted 我叫白小飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM学习-类加载和类加载器相关的知识,希望对你有一定的参考价值。

一、概述:类加载和类加载器

在java代码中,类型的加载、连接、与初始化过长都是在程序运行期间完成的1.1 Java虚拟机与程序的生命周期:在如下几种情况的时候,java虚拟机将结束生命周期:

  • 执行了System.exit()方法
  • 程序正常执行结束
  • 程序执行过程中遇到了异常或者错误而异常终止
  • 操作系统错误导致虚拟机进程终止

1.2 类的加载、连接与初始化:

  • 加载:查找并加载类的二进制数据
  • 连接
  •  验证:确保被加载的类的正确性 
    
  •  准备:为类的静态变量分配内存,并将其初始化为默认值
    
  •  解析:把类中的符号引用转换为直接引用 初始化:为类的静态变量赋予正确的初始值
    
  • 使用
  • 卸载

1.3 java程序对类的使用方式分为两种:

主动使用

  • 创建类的示例 : new object()
  • 访问某个类或接口的静态变量,或者对该静态变量赋值 (助记符:getstatic 获取类的静态变量,putstatic 访问类的静态变量)
  • 调用类的静态方法 (助记符:invokestatic 调用类的静态方法)
  • 反射(如 Class.forName(“com.xxx.xxx”))
  • 初始化一个类的子类
  • java虚拟机启东时被标明为启动类的类 (JavaTest) JDK1.7 开始提供动态语言的支持

被动使用

所有java虚拟机实现必须在每个类或接口被java程序“首次主动使用” 时 才初始化他们

二、类的加载

类的加载是指将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后再内存中创建一个java.lang.Class对象(未指定存放位置)用来封装类在方法区内的数据结构

加载.class文件的方式:
  • 从本地系统中直接加载
  • 通过网络下载.class文件
  • 从zip、jar等归档文件中加载
  • 从专有数据库中提取.class文件
  • 将java源文件动态编译为.class文件 (动态代理:程序运行时才生成类,动态生成.class文件)

类的加载最终的产品是位于内存中的Class对象

2.1 类加载器
Java虚拟机自带的加载器

  • 根类加载器(Bootstrap)
  • 扩展类加载(Extension)
  • 系统(应用)类加载器(System)

用户自定义的加载器

  • java.lang.ClassLoader的子类
  • 用户可以定制类的加载方式

注意:

  1. 类加载器并不需要等到某个类被“首次主动使用”时再加载它,类的加载和是否首次主动使用没有直接关系
    ,JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中遇到了.class文件缺失或存在错误,类加载器必须在程序首次主动使用该类时才报告错误(LinkageError错误),如果这个类一直未被主动使用,则不会报错
  2. 调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。2.2类的验证
    类被加载后,进入到连接阶段,即将已读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。jvm

以上是关于JVM学习-类加载和类加载器的主要内容,如果未能解决你的问题,请参考以下文章

JVM进阶之路十四:类加载器和类加载机制

JVM进阶之路十四:类加载器和类加载机制

jvm之java类加载机制和类加载器(ClassLoader)的详解

jvm之java类加载机制和类加载器(ClassLoader)的详解

jvm之java类加载机制和类加载器(ClassLoader)的详解

VM核心:JVM运行和类加载