`
kaihuigy
  • 浏览: 5675 次
社区版块
存档分类
最新评论

类和对象的生命周期

    博客分类:
  • JVM
阅读更多

Section 1:类和对象的生命周期

  1. 装载
  2. 连接(验证、准备、解析)
  3. 初始化

类只有在被主动使用的时候才会初始化,主动初始化有6中情况:

  1. 创建某个类的新实例。(new或者反射、反序列化等)
  2. 调用某个类的静态方法。
  3. 调用类或者接口的静态字段。final的静态字段除外,任何对final的静态字段引用都会直接被编译器优化成相应的值。
  4. 使用反射
  5. 初始化某个子类时,要求超类必须初始化。此规则不适用于接口:子接口初始化时,只有使用到父接口的非常量字段时,父接口才会初始化。
  6. 虚拟机启动时,被包含为启动类的类(即包含main方法的)。

一.装载

  1. 通过全限定类名,将class的二进制流装载
  2. 产生方法区内部的数据结构
  3. 生成Class类实例。

二.连接

连接分为三个步骤:验证、准备、解析

  • 验证:检查Class对象的字节码有效性;检查是否符合Java语义(比如final类不能有子类等)。
  • 准备:为类变量分配内存,设置初始值。此处的初始值是指变量的原始初始值,而不是程序赋予的初始值。
  • 解析:虚拟机可以推迟这一步。解析是将符号引用替换成直接引用。

三.初始化

初始化是为类变量赋予正确的初始值。 所有的类变量初始化语句和静态初始化器都会被放在<clinit>方法里。

四.卸载

当类不再需要被使用是,类就会被从方法区中释放

Section 2:类的实例(对象)的生命周期

类的实例可以通过以下四种方法创建:

  1. new
  2. 反序列化的readObject
  3. 反射的Class.newInstance()或者java.refelect.Constructor
  4. clone

编译器会为每个类生成至少一个初始化方法:init

对象的创建还包含隐式的情况(多为编译器优化)。如

String a="abc"+var1

会创建2个String对象和一个StringBuffer对象等。

Section 3:查看类加载的日志

通过JVM参数 -verbose:class 可以查看类的加载情况。

参考此处的代码例子.

类Student继承了类People。
接口StudentService继承了接口PeopleService。
DummyServiceImpl实现了StudentService。

在Show.java的main方法中如下调用

Student s=new Student();
	
new DummyServiceImpl();

使用 java -verbose:class Show执行后可以看到(已经略去其它java必须类的加载):

[Loaded yangqi.hotspot.classlifecycle.Show from file:/Users/yangqi/opensource/cp/bin/]
[Loaded yangqi.hotspot.classlifecycle.People from file:/Users/yangqi/opensource/cp/bin/]
[Loaded yangqi.hotspot.classlifecycle.Student from file:/Users/yangqi/opensource/cp/bin/]
[Loaded yangqi.hotspot.classlifecycle.PeopleService from file:/Users/yangqi/opensource/cp/bin/]
[Loaded yangqi.hotspot.classlifecycle.StudentService from file:/Users/yangqi/opensource/cp/bin/]
[Loaded yangqi.hotspot.classlifecycle.DummyServiceImpl from file:/Users/yangqi/opensource/cp/bin/]

可以看到,Show作为启动类,第一个被加载。

因为Student的父类是People,所以要初始化Student必须加载People。

DummyServiceImpl的接口和父接口同理,不过此时虽然加载了这些接口,但是他们并没有被初始化。参考Section1中初始化的6中情况中的第五种。

 

分享到:
评论

相关推荐

    Hibernate对象的生命周期

    Hibernate对象的生命周期 Hibernate对象的生命周期 Hibernate对象的生命周期

    Java中对象的生命周期 ..doc

    1. **对象生命周期的开始**: - 当对象被创建时,其生命周期开始。首先需要为对象分配内存空间,在Java堆内存中进行。 - 接着,对象的实例变量会被初始化为其默认值或指定的初始值。 - 对象可以通过多种方式创建...

    JVM中对象的生命周期

    在Java虚拟机(JVM)中,对象的生命周期包含了多个阶段,这些阶段共同决定了一个对象从诞生到消亡的过程。以下是这些阶段的详细介绍: **创建阶段(Creation)** 在这个阶段,对象从无到有,主要经历以下几个步骤:...

    C#第八章(对象的生命周期)

    总之,C#中的对象生命周期管理通过CLR和垃圾回收器提供了一套自动化的内存管理机制。通过学习本章内容,开发者将能够理解并掌握如何在C#中创建和管理对象,以及如何通过各种方式正确地处理资源释放问题,以编写出...

    08 领域对象的生命周期 102-116.rar

    9. **生命周期方法**:在某些编程语言和框架中,领域对象可能包含一些生命周期方法,如 `save()`、`delete()`、`load()` 等,用于操作对象的生命周期。 10. **CQRS(命令查询责任分离)**:在复杂系统中,CQRS 模式...

    08 领域对象的生命周期 87-101.rar

    综上所述,领域对象的生命周期管理是软件开发中至关重要的一部分,它涉及到对象的创建、使用、状态管理、持久化、查询和销毁等多个环节。理解和掌握这些知识点对于构建高效、稳定且符合业务需求的系统至关重要。在...

    测试实体对象的生命周期

    本文将详细探讨“测试实体对象的生命周期”,并结合给定的标签“源码”和“工具”,阐述如何通过Hibernate Session来理解和控制这些对象的状态。 首先,理解实体对象的生命周期对于数据库操作至关重要。在Hibernate...

    对象的生命周期.pdf

    在Java中,对象可以通过多种方式创建,这些创建过程标志着对象生命周期的开始。本章节详细介绍了四种常见的创建对象的方法: 1. **使用`new`语句创建对象**:这是创建Java对象最常见的方法。通过这种方式,我们可以...

    Java中类的生命周期

    在这个周期内,JVM负责管理所有类和对象的生命周期。 **2. Java程序与JVM生命周期的一致性** 程序生命周期与Java虚拟机生命周期是一致的。这意味着Java虚拟机进程从创建起的任务就是执行Java程序,直至程序正常...

    asp.net生命周期

    这个生命周期涉及多个阶段,对于理解和优化ASP.NET应用程序的性能至关重要。 首先,当一个HTTP请求到达Web服务器(通常是IIS)时,服务器会根据请求的文件扩展名决定哪个ISAPI(Internet Server API)扩展来处理...

    Hibernate持久化对象的生命周期

    总的来说,理解Hibernate中持久化对象的生命周期是优化数据库操作的关键,它直接影响到对象与数据库之间的交互效率和数据的一致性。掌握这些概念可以帮助开发者编写出更加高效、健壮的Java应用。

    Activity生命周期管理

    总结起来,Activity生命周期管理是Android开发中的关键技能,通过合理使用`ActivityLifeCallbackManagers`和`ActivityLifeCallbackManager`这样的工具类,可以更高效、准确地控制和监控Activity的状态,从而提高应用...

    2022年CORBA对象生命周期之实现和内存管理Java教程.docx

    CORBA 对象生命周期之实现和内存管理 Java 教程 CORBA(Common Object Request Broker Architecture)是一种分布式对象架构,允许不同语言编写的对象之间进行通信。CORBA 对象生命周期是指对象从创建到销毁的整个...

    UIView的生命周期

    UIView的生命周期对于理解iOS应用中视图的加载和管理至关重要。在开发iOS应用时,了解UIView及其子类的生命周期方法,可以让开发者合理地安排资源的分配和释放,优化应用的性能,以及提供更好的用户体验。 首先,...

    TAO对象生命周期服务.rar_TAO_TAO COR_corba_lifecycle

    总之,掌握TAO对象生命周期服务不仅能够帮助我们更好地理解和应用CORBA规范,还能够提高我们在分布式系统设计中的专业能力。通过实际项目的实践,我们可以更好地掌握这些概念,并将其运用到更复杂的系统中,提升软件...

    Java对象生命周期管理.pdf

    在实际开发中,了解对象生命周期管理并合理利用,如选择合适的垃圾收集器,控制对象的创建和存活,可以帮助提升应用程序的性能。例如,使用`WeakReference`或`SoftReference`来弱化对象引用,可以使得垃圾收集器更...

    Activity和Fragment的生命周期

    在Android应用开发中,Activity和Fragment是两个至关重要的组件,它们构成了用户界面的主要部分,并各自具有独特的生命周期。了解和掌握这两个组件的生命周期是每个Android开发者必须具备的基础技能。 首先,我们来...

    apple程序生命周期

    对于iPhone开发来说,掌握这个生命周期有助于编写更加高效和响应良好的应用。 首先,让我们回顾一下Objective-C中的协议(Protocol)。协议在iOS开发中扮演着接口的角色,允许类之间定义一套可选或必需的方法。在...

Global site tag (gtag.js) - Google Analytics