zoukankan      html  css  js  c++  java
  • java类型生命周期

    开始阶段

    装载:把二进制形式的java类型读入jvm中。

    1)通过该类型的完全限定名,产生一个代表该类型的二进制数据流;
    2)解析这个二进制数据流为方法区内的内部数据结构;
    3)创建一个表示该类型的java.lang.Class类的实例;

    连接:把已读入的类型数据合并到虚拟机的运行时状态中。

    1)验证:确保java类型数据格式正确并且适用于jvm使用;
    2)准备:为该类型分配内存;
    3)解析:把常量池中的符号引用转换为直接引用;

    初始化:每个类和接口在首次主动使用时初始化。为类变量赋予正确的初始值;

    1)如果类存在直接超类,且直接超类没有被初始化,先初始化直接超类;
    2)如果类存在初始化方法,就执行此方法;

    只有六种活动被认为是主动使用:

    1)、创建类的新实例
    2)、调用类中声明的静态方法
    3)、操作类或者接口中声明的非常量静态字段
    4)、调用Java API中特定的反射方法
    5)、初始化一个类的子类
    6)、指定一个类作为jvm启动时的初始化类

    使用阶段(绝大部分时间)

    实例化

    实例化途径

    明确实例化一个类的四种途径:
    1)、new操作符;
    2)、调用Class或者Java.lang.reflect.Constructor对象的newInstance()方法;
    3)、调用任何现有对象的Clone()方法;
    4)、通过java.io.ObjectInputStream类的getObject()方法反序列化;

    隐含实例化的几种途径:
    1)、保存命令行参数的String对象;
    2)、和类装载相关,jvm装载的每一个类型,会暗中实例化一个Class对象来代表这个类型;
    3)、和类装载相关,当jvm装载了在常量池中包含CONSTANT_String_info入口类的时候,会创建新的String对象的实例来表示这些常量字符串;
    4)、通过执行包含字符串连接操作符的表达式产生对象;

    实例化步骤

    1)、在堆中为保存对象的实例变量分配内存;
    2)、为实例变量初始化为默认的初始值;
    3)、为实例变量赋正确的初始值,有三种技术完成赋值:
      a)、如果对象是clone() 创建的,jvm把原实例变量中的值拷贝到新对象中;
      b)、如果是通过ObjectInputStream类的readObject()调用反序列化的,jvm从输入流中读取的值来初始化实例变量;
      c)、jvm调用对象的实例化方法把对象的实例变量初始化为正确的初始值;

    垃圾收集和对象终结

    jvm实现必须具有某种自动堆存储管理策略,大部分是使用垃圾收集器。如果类声明了 void finalize()方法,垃圾收集器在释放实例内存前会执行这个方法。
    垃圾收集器自动调用的finalize()方法抛出的任何异常都将被忽略。

    结束阶段

    从jvm中卸载类型

    很多情况,jvm中类的生命周期和对象的生命周期很相似。jvm如何判断动态装载的类型是否仍然被程序使用,其判断方式和判断对象是否仍然被使用很相似。
    如果程序不再引用某类型,那么类型就是不可触及的,就可以被卸载。
    使用启动类装载器装载的类型永远都是可触及的,所以永远不会被卸载。只有使用用户定义的类装载器装载的类型才会变成不可触及,才会被卸载。

    整理自《深入Java虚拟机第二版》

  • 相关阅读:
    基本技能训练之线程
    关于UEditor的使用配置(图片上传配置)
    PAT 乙级练习题1002. 写出这个数 (20)
    codeforces 682C Alyona and the Tree DFS
    codeforces 681D Gifts by the List dfs+构造
    codeforces 678E Another Sith Tournament 概率dp
    codeforces 680E Bear and Square Grid 巧妙暴力
    codeforces 678D Iterated Linear Function 矩阵快速幂
    codeforces 679A Bear and Prime 100 交互
    XTUOJ 1248 TC or CF 搜索
  • 原文地址:https://www.cnblogs.com/tenghoo/p/java_type_life_cycle.html
Copyright © 2011-2022 走看看