27 类的生命周期

网络测
• 阅读 748

jvm是不会读.java文件的,需要编译成.class文件才行

  1. 加载

    1. 通过全类名获取此类的二进制字节流
    2. 将字节流所代表的静态存储结构转换成方法区的运行时数据结构
    3. 在内存中生成一个class对象,作为方法区这些数据的访问入口

    数组类型是由java虚拟机直接创建的,不是通过类加载器创建的。
    非数组类型可以通过自定义类加载器完成加载。(重写loadclass方法)

  2. 连接

    加载阶段未结束,连接阶段可能已经开始了。

    • 验证

      • 文件格式验证
        验证字节流是否符合class文件格式规范

        • 是否以0xCAFEBABE开头
        • 主次版本号是否在当前虚拟机处理范围之内
        • 常量池中的常量是否有不被支持的类型
      • 元数据验证
        对字节码的信息进行语义分析,保证描述的信息符合java
        语言规范

        • 类是否有父类
        • 是否继承了不能被继承的类(被final修饰的类)
      • 字节码验证

        • 验证程序语义合法
      • 符号引用验证
    • 准备

      为类变量(即静态变量)分配内存并设置变量初始值。
      在1.7前放在永久代方法区,1.7后字符串常量池、静态变量移动到堆中。
      这里的初始值是数据类型对应的0值。如果被final修饰了,则被赋值为实际值。

    • 解析

      将常量池内的“符号引用”替换为“直接引用”。
      针对类、接口、类方法、接口方法、方法类型、方法句柄、和调用限定符。
      直接引用是指向目标的指针、相对偏移量或可间接定位到目标的句柄。每个类有一张方法表存放类中所有方法,只要知道某方法在表中偏移量就可以直接调用。

  3. 初始化

    这一步jvm开始真正执行类中定义的java程序代码。
    执行<clinit>方法,带锁线程安全,可能引起阻塞。
    以下五种情况,必须对类进行初始化

    • new、getstatic、putstatic、invokestatic指令,分别是创建实例、访问静态变量、给静态变量赋值、调用类静态方法。
    • 使用java.lang.reflect包对类进行反射调用时,例如class.forname(""),newInstance()
    • 初始化类时,如果父类没初始化,要先初始化父类
    • 虚拟机启动时,会先初始化main方法所在的类
    • 要使用轻量级的反射调用methodHandle、VarHandle,必须先使用findStaticVarHandle初始化类
    • 如果接口定义了jdk8新加入的默认方法(被default修饰的方法),初始化这个接口的实现类之前要先初始化接口。
  4. 使用

  5. 卸载

    卸载即class对象被gc,需要满足三个要求

    1. 所有实例对象都被gc了。
    2. 类没有被任何地方引用。
    3. 类加载器实例被gc。
      由jvm自带的类加载器加载的类是不会被卸载的,由我们自定义的类加载器加载的类是可能被卸载的。
点赞
收藏
评论区
推荐文章
2021年度最全面JVM虚拟机,类加载过程与类加载器
前言类装载器子系统是JVM中非常重要的部分,是学习JVM绕不开的一关。一般来说,Java类的虚拟机使用Java方式如下:Java源程序(.java文件)在经过Java编译器编译之后就被转换成Java字节代码(.class文件)。类加载器负责读取Java字节代码,并转换成java.lang.Class类的一个实例。每个这样的实例用来表
灯灯灯灯 灯灯灯灯
4年前
图文详解,史上最全【类加载子系统】解说!!
内存结构概述简图详细图英文版中文版注意:方法区只有HotSpot虚拟机有,J9,JRockit都没有如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢?1.类加载器2.执行引擎类加载器子系统类加载器子系统作用:1.类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。2.ClassLo
2021年度最全面JVM虚拟机,类加载过程与类加载器
前言类装载器子系统是JVM中非常重要的部分,是学习JVM绕不开的一关。一般来说,Java类的虚拟机使用Java方式如下:Java源程序(.java文件)在经过Java编译器编译之后就被转换成Java字节代码(.class文件)。类加载器负责读取Java字节代码,并转换成java.lang.Class类的一个实例。每个这样的实例用来表
Stella981 Stella981
3年前
ClassLoader解惑
一、什么是Classloader    一个Java程序要想运行起来,首先需要经过编译生成.class文件,然后创建一个运行环境(jvm)来加载字节码文件到内存运行,而.class文件是怎样被加载中jvm中的就是JavaClassloader所做的事情。    那么.class文件什么时候会被类加载器加载到j
Wesley13 Wesley13
3年前
Java文件格式
\.java文件是保存源代码的文本文件(\代表类名)使用javac\.java可以编译该文件使用java\可以运行该类\.class是用于保存Java类的二进制编码以及Class对象,每一个Java类都有一个解释该类特征的Class对象。\.jar文件是一种压缩文件格式打包命令jarcvf
Stella981 Stella981
3年前
Jvm类的加载机制
1.概述虚拟机加载Class文件(二进制字节流)到内存,并对数据进行校验、转换解析和初始化,最终形成可被虚拟机直接使用的Java类型,这一系列过程就是类的加载机制。2.类的加载时机类从被虚拟机加载到内存开始,直到卸载出内存为止,整个生命周期包括:加载——验证——准备——解析——初始化——使用——卸载这7个阶段。其中验
Wesley13 Wesley13
3年前
JDBC之数据库的连接步骤(六步)
1.加载驱动在连接数据库之前,需要加载数据库的驱动到JVM(Java虚拟机),这需要通过java.lang.Class类的静态方法forName(StringclassName)实现.例如://加载Oracle的驱动try{Class.forName("oracle.jdbc.OracleDriver");}catch(ClassNo
Stella981 Stella981
3年前
Android动态加载之ClassLoader详解
Dalvik虚拟机如同其他Java虚拟机一样,在运行程序时首先需要将对应的类加载到内存中。而在Java标准的虚拟机中,类加载可以从class文件中读取,也可以是其他形式的二进制流。因此,我们常常利用这一点,在程序运行时手动加载Class,从而达到代码动态加载执行的目的。只不过Android平台上虚拟机运行的是Dex字节码,一种对class文件优化的产物
Stella981 Stella981
3年前
JVM中的Stack和Frame
JVM执行Java程序时需要装载各种数据,比如类型信息(Class)、类型实例(Instance)、常量数据(Constant)、本地变量等。不同的数据存放在不同的内存区中,这些数据内存区称作“运行时数据区(RuntimeDataArea)”。运行时数据区有这样几个重要区:JVMStack(简称Stack或者虚拟机栈、线程栈、栈等),Frame(又称S
Stella981 Stella981
3年前
EKT Java企业级关键技术强化 Enterprise Edition
EKTenterprisekeytechlology企业关键技术本章目标:1.理解Class类2.理解JAVA类加载体系结构3.理解类的加载过程Class对象由JVM自动产生,每当一个类被加载时,JVM就自动为其生成一个Class对象,通过Class对象可以获得类的相关信息。将类信息读到内存中过程,称为类加载
Wesley13 Wesley13
3年前
Java基础之数组队列及Java堆外内存学习笔记[图]
Java基础之数组队列及Java堆外内存学习笔记\图\1.数组1.1数组基本概念:数组是一个容器,可以存储同一数据类型的N个数据;数组是一个数据结构,是数据结构中访问速度最快的;数组是直接通过下标进行定位;数组是属于引用数据类型(数组名中存储的是内存首地址);数组本身只有有length属性(获取数组能存储的数据个数),但是