java对象生命周期

  java中一个对象的完整生命周期涉及java平台的很多技术。在创建一个java对象之前,需要先由虚拟机加载该类,然后对该java类进行链接和初始化。初始化完成之后,才创建出该类的对象实例。java对象也有自己的初始化过程,主要通过构造方法完成。当不再有引用指向该对象时,对象占用的内存会在合适的时机被垃圾回收器回收。对象终止机制提供了一种方式在对象被回收之前进行清理工作。

  •  java类的链接

  虚拟机刚启动时,内部只包含java核心类的相关信息。随着程序的运行,不断有新的java类被加载到虚拟机中。java类被加载之后,经过链接和初始化就可以虚拟机中使用了。链接的过程是把java类的字节码中包含的信息与虚拟机中的内部信息进行合并,使java类的代码可以执行。链接的过程包含3个步骤,分别是验证,准备和解析。在链接过程中会对java类的直接父类或父接口进行验证和准备,但对类中形式引用的解析是可选的。

  验证:验证是用来确保java类的字节代码在结构上是正确的。验证过程可能会导致其他java类或接口被加载。字节码格式不正确会抛出java.lang.VerfyError错误。

  准备:准备过程会创建java类中的静态域,并将这些域的值设为默认值。准备过程不会执行代码。

  解析:解析过程是处理所加载的java中包含的形式引用。在解析过程会遇到的一个问题是如何处理复杂的引用关系图,通常有两种策略:1,提前解析:即递归地对形式引用进行解析;2,延迟解析:当真正需要一个形式引用才进行解析。

  • java类的初始化

  当一个java第一次真正使用时,虚拟机会对该java类进行初始化。初始化的主要工作是执行java类中的静态代码块和初始化静态域。在初始化过程中,按出现顺序进行初始化,在初始化之前,它的直接父类也会被初始化,但是java类实现的接口不会被初始化。

  需要注意的是当访问一个java类或接口中的静态域时,只有真正声明这个域的类或接口接口才会被初始化。

  •  对象的创建与初始化 

  在创建对象时,实际的初始化流程实现沿着继承层次结构树往上传递,完成部分初始化工作。到达Object类之后,再沿着层次结构树向下;完成其余的初始化工作,最后回到最初的java类。

  在进行对象创建之前,需要为对象分配内存空间,大小取决于java类及其父类和祖先类包含的所有实例域的数量和类型。如果内存分配成功,则把对象的所有实例域都设为默认值。

  类的构造方法的调用过程分为三步:1,调用父类的构造方法;2,初始化类中的实例域的值(按照出现顺序);3,执行类的构造方法。实际的执行流程会先跳转到父类的构造方法,再沿着继承层次结构树依次往上跳转,直到到达Object类,不在向上跳转,而是执行后两步操作。整个过程是一个典型的递归调用过程。

  • 对象终止

    待续

时间: 2024-12-18 15:05:13

java对象生命周期的相关文章

hibernate session缓存和java对象生命周期

一.java对象生命周期 1.在java中,使用new关键字,创建一个java对象,jvm就为这个对象分配一块内存空间.只要这个变量被引用,他就一直存在于内存中.如果没有被任何变量引用(包括间接引用),那么这个对象就会被垃圾回收器回收.下面用一段代码来解释: Customer c=new Customer(); Order o1=new Order(); Order 02=new Order(); o1.setCustomer(c); c.getOrders().add(o1); o1=null

java类生命周期详细解析

(一)详解java类的生命周期 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正. 首先来了解一下jvm(java虚拟机)

Java学习之==>Java线程生命周期与状态切换

一.Java线程生命周期与状态切换 这些状态的描述可以总结成下图: NEW 一个刚创建但尚未启动的Java线程实例就是处于 NEW 状态 public class App { public static void main(String[] args) { Thread thread = new Thread(); Thread.State state = thread.getState(); System.out.println(state); } } // 输出结果 NEW RUNNABLE

[翻译]理解C#对象生命周期

看到网上的一篇讲C#对象生命周期(Object Lifetime)的文章,通俗易懂,而且有图,很适合初学者学习,就翻译过来了.后来发现这是Pro C# 2010 and the .NET 4 Platform的第八章中的一部分.(感谢 大乖乖 提醒).文中的专业名词第一次出现时,括号里会标注对应的英文单词. 请尊重作者劳动,转载请注明出处:http://www.cnblogs.com/Jack47/archive/2012/11/14/2770748.html. ----2012年11月15日修

struts2.0中Action的对象生命周期详解!!(转)

原文出处:http://blog.csdn.net/wxy_g/article/details/2071662 有很多人问Struts2.0中的对象既然都是线程安全的,都不是单例模式,那么它究竟何时创建,何时销毁呢? 这个和struts2.0中的配置有关,我们来看struts.properties ### if specified, the default object factory can be overridden here ### Note: short-hand notation is

.Net组件程序设计之对象生命周期

.Net组件程序设计之对象生命周期 .NET 垃圾回收 IDisposable() Using语句 .NET 垃圾回收 是CLR管理着垃圾回收器,垃圾回收器监控着托管堆,而我们使用的对象以及系统启动是所需要的一些必备的对象信息都存在于托管堆上,CLR会维护着一个列表(对象引用信息列表). 这个列表里存放的信息就是对应着托管堆中所有对象的信息(引用.被引用信息)每当使用一个新的对象或者是改变一个现有对象的引用CLR都会更新 对象引用信息列表.那么回收器一般什么时候调用呢? 垃圾回收器大多数是在托管

【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppe

iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewController对象的视图已经加入到窗口时调用: viewWillDisappear-UIViewCont

_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewController对象的视图已经加入到窗口时调用: viewWillDisappear-UIViewCont

IOS 视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途

iOS视图控制对象生命周期-init.viewDidLoad.viewWillAppear.viewDidAppear.viewWillDisappear.viewDidDisappear的区别及用途 init-初始化程序 viewDidLoad-加载视图 viewWillAppear-UIViewController对象的视图即将加入窗口时调用: viewDidApper-UIViewController对象的视图已经加入到窗口时调用: viewWillDisappear-UIViewCont