黑马程序员技术交流社区

标题: 关于生命周期的问题 [打印本页]

作者: 张治国    时间: 2014-4-3 18:10
标题: 关于生命周期的问题
本帖最后由 张治国 于 2014-4-6 09:31 编辑

我们大家这些初学者天天在DOS命令下编译,运行。那一个类在被加载到运行结束,它的整个生命周期都有哪些?
作者: Engle    时间: 2014-4-3 21:14
类的生命周期
        当我们编写一个java的源文件后,经过编译会生成一个后缀名为class的文件,这种文件叫做字节码文件,只有这种字节码文件才能够在java虚拟机中运行,java类的生命周期就是指一个class文件从加载到卸载的全过程。
        一个java类的完整的生命周期会经历加载、连接、初始化、使用、和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直接被使用的情况。
       1. 加载
       在java中,我们经常会接触到一个词——类加载,它和这里的加载并不是一回事,通常我们说类加载指的是类的生命周期中加载、连接、初始化三个阶段。在加载阶段,java虚拟机会做什么工作呢?其实很简单,就是找到需要加载的类并把类的信息加载到jvm的方法区中,然后在堆区中实例化一个java.lang.Class对象,作为方法区中这个类的信息的入口。
      2.连接
       连接阶段比较复杂,一般会跟加载阶段和初始化阶段交叉进行,这个阶段的主要任务就是做一些加载后的验证工作以及一些初始化前的准备工作,可以细分为三个步骤:验证、准备和解析。
       3.初始化
       如果一个类被直接引用,就会触发类的初始化。在java中,直接引用的情况有通过new关键字实例化对象、读取或设置类的静态变量、调用类的静态方法。
       4.使用
       类的使用包括主动引用和被动引用
       5.卸载
该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例,该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
        如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。

作者: 黄泉    时间: 2014-4-4 10:15
在一个类编译完成之后,下一步就需要开始使用类,如果要使用一个类,肯定离不开JVM。在程序执行中JVM通过装载,链接,初始化这3个步骤完成。
类的装载是通过类加载器完成的,加载器将.class文件的二进制文件装入JVM的方法区,并且在堆区创建描述这个类的java.lang.Class对象。用来封装数据。 但是同一个类只会被类装载器装载以前
链接就是把二进制数据组装为可以运行的状态。

链接分为校验,准备,解析这3个阶段
校验一般用来确认此二进制文件是否适合当前的JVM(版本),
准备就是为静态成员分配内存空间,。并设置默认值
解析指的是转换常量池中的代码作为直接引用的过程,直到所有的符号引用都可以被运行程序使用(建立完整的对应关系)
完成之后,类型也就完成了初始化,初始化之后类的对象就可以正常使用了,直到一个对象不再使用之后,将被垃圾回收。释放空间。
当没有任何引用指向Class对象时就会被卸载,结束类的生命周期
作者: 一世英明    时间: 2014-4-4 12:43
兄弟借点技术分用用啊!!
类的生命周期
  加载-----连接(1,验证;2,准备;3,解析;)---------初始化------使用-----卸载

总结:对象基本上都是在JVM 的堆区中创建,在创建对象之前,会触发类加载(加载,连接,初始化),当类
初始化完成后,根据类信息在堆区中实例化类对象,初始化非静态变量,非非静态代码以及默认构造方法,
,当对象使用完之后会在合适的时候被jvm垃圾收集器回收。
        类的整个生命周期则要比对象的生命周期长的多。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2