类的生命周期
.java源文件经过编译后会生成相应的字节码文件(.class)。jvm通过解释器翻译字节码文件并在系统中执行。
而java类的生命周期就是其字节码文件装载、连接、初始化、使用、和卸载的整个过程。
● 装载。
jvm找到需要装载的类,将类的信息装载到jvm的方法区中。然后在堆区实例化一个java.lang.Class对象,作为方法区中的类的信息入口。
不同的jvm对于类的装载时机并不相同,有些在遇到这个类时就装载这个类(虽然并不知道这个类是否会被用到),另一些则在真正用到一个类的时候才对它进行装载。
● 连接阶段。连接阶段一般情况下在一个类加载了一部分之后就开始,与装载阶段交叉进行。连接阶段主要做一些加载后的验证以及初始化的准备工作,分为验证、准备、解析三个子阶段。
1、验证主要是验证一个被加载的类是否合法,以确保这个类能够被jvm运行。
2、准备阶段为类中的静态变量分配内存和jvm默认初值(不是程序中设定的初值。对于jvm,基本类型的默认处置为0,而引用类型为null),并为常量分配我们在程序中设定的初值。
3、解析是指把常量池中的符号引用转换为直接引用,即将所有的类名、接口名、字段名、方法名转换为具体的内存地址。
● 如果一个类被直接引用,则会触发类的初始化。被动引用则不会触发类的初始化。
直接引用的情况有:
1、创建类的新实例
2、调用类的静态方法
3、操作类或接口的静态字段(final字段除外)
4、调用Java的特定的反射方法
5、初始化一个类的子类
6、指定一个类作为Java虚拟机启动时的初始化类
初始化过程会初始化与类相关的赋值语句和静态语句(即有static关键字修饰的信息),其他语句在实例化对象的时候才会运行。
初始化按照顺序运行类中的赋值语句和静态语句。如果有父类,则首首先运行父类中的语句。
以下情况不会引起类的初始化:
◇ 定义类数组
SampleClass[] samples = new SampleClass[5]; |
◇ 引用类的常量
String sampleConstant = SampleClass.SampleConstant; |
● 使用
类的使用包括主动引用和被动引用。只有主动引用会实例化类对象。
● 卸载
如果下面的所有情况都成立,类将会被卸载:
1、类所有的实例都已经被回收。(即堆中不存在该类的任何实例)
2、加载该类的ClassLoader被回收。
3、该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
jvm在方法区垃圾回收的时候对类进行卸载,在方法区中清空类信息。
至此,一个java类的生命周期结束。
对象的生命周期
java对象是在jvm的堆区创建的。在创建对象之前,可能会触发类的加载、连接和初始化。
jvm在类初始化完成后,根据类的信息在堆区实例化类对象,初始化非静态变量和默认构造方法。
由于java在堆上创建对象,因此编译器对对象的生命周期一无所知。Java提供了垃圾回收器机制,jvm会在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。
分享到:
相关推荐
Java中对象的生命周期 自己总结 Java中对象的生命周期 private构造方法
java对象的生命周期,讲得很详细,很好的东东哦
关于JVM中对象的生命周期的讲解,不错!!
主要介绍了Java对象在JVM中的生命周期详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Hibernate持久化对象的生命周期 持久化对象的状态: 瞬时对象(Transient Objects)持久化...Java对象在JVM中的生命周期 理解Session的缓存 在Hibernate应用中Java对象的状态 Session的保存、更新、删除、查询方法:
本文详细讲述了一个java类自调入内存至被卸载的整个声明周期,对理解对象的生命周期,jvm中的类加载等内容有所帮助。
全书内容包括面向对象的编程思想、Java语言的基础知识、异常处理、类与对象的生命周期、多线程、Java集合、输入/输出和GUI编程等。其最大特色是以六条主线贯穿全书:面向对象编程思想、Java语言的语法、Java虚拟机...
主要介绍了Java 详解垃圾回收与对象生命周期的相关资料,这里对堆内存与栈内存进行详解及JVM 的生命周期介绍,需要的朋友可以参考下
T21.4_持久化对象生命周期 java 经典教程 经典教材
要理解java对象的生命周期,我们需要要明白两个问题, 1、java是怎么分配内存的 ,2、java是怎么回收内存的。 喜欢java的人,往往因为它的内存自动管理机制,不喜欢java的人,往往也是因为它的内存自动管理...
对象的生命周期,这是孙卫琴书中的单独的一章!将的挺不错的!可以参考一下!!
Java对象的生命周期[参照].pdf
一个完整的类的生命周期如下: 注意: 加载并不是类加载,类加载包括加载到初始化的五个阶段。而加载是第一步。 1、类加载 加载: 将类的二进制流加载进VM,储存在方法区,并且生成java.lang.Class对象 类加载器有三...
2022年CORBA对象生命周期之实现和内存管理Java教程.docx
Java对象实体类属性字段对比变化过程是指在一个Java对象实体类的生命周期中,其属性字段的变化情况。这种变化过程通常涉及到对象的创建、使用和销毁等阶段。 在对象的创建阶段,Java对象实体类会根据预设的属性字段...
本书内容包括:面向对象的编程思想、Java语言的基础知识、异常处理、类与对象的生命周期、多线程、Java集合、泛型、Annotation标注、输入/输出和GUI编程,以及JDK8引入的如虎添翼的新特征,比如支持函数式编程的...
全书内容包括面向对象的编程思想、Java语言的基础知识、异常处理、类与对象的生命周期、多线程、Java集合、输入/输出和GUI编程等。其最大特色是以六条主线贯穿全书:面向对象编程思想、Java语言的语法、Java虚拟机...
由Java虚拟机自带的默认加载器(根加载器、扩展加载器、系统加载器)所加载的类在JVM生命周期中始终不被卸载。所以这些类的Class对象(我称其为实例的模板对象)始终能被触及!而由用户自定义的类加载器所加载的类会...