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虚拟机第二版》

  • 相关阅读:
    delphi 让子窗体显示最大化
    Delphi 中拖动无边框窗口的5种方法
    Delphi 非主窗体(即子窗体)在任务栏显示按钮
    电脑快捷键大全
    picpick快捷键
    is()
    animate()
    :animated
    css() 方法返回或设置匹配的元素的一个或多个样式属性。
    outerWidth()
  • 原文地址:https://www.cnblogs.com/tenghoo/p/java_type_life_cycle.html
Copyright © 2011-2022 走看看