`
stinge
  • 浏览: 155643 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java对象声明周期

    博客分类:
  • java
阅读更多

JVM中对象的生命周期
在JVM运行空间中,对象的整个生命周期大致可以分为7个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段 (Invisible)、不可到达阶段(Unreachable)、可收集阶段(Collected)、终结阶段(Finalized)与释放阶段 (Free)。上面的这7个阶段,构成了JVM中对象的完整的生命周期。下面分别介绍对象在处于这7个阶段时的不同情形。

2.2.1 创建阶段
在对象创建阶段,系统要通过下面的步骤,完成对象的创建过程:

(1)为对象分配存储空间。

(2)开始构造对象。

(3)递归调用其超类的构造方法。

(4)进行对象实例初始化与变量初始化。

(5)执行构造方法体。

上面的5个步骤中的第3步就是指递归地调用该类所扩展的所有父类的构造方法,一个Java类(除Object类外)至少有一个父类(Object),这个 规则既是强制的,也是隐式的。你可能已经注意到在创建一个Java类的时候,并没有显式地声明扩展(extends)一个Object父类。实际上,在 Java程序设计中,任何一个Java类都直接或间接的是Object类的子类。例如下面的代码:

public class A {



}

这个声明等同于下面的声明:

public class A extends java.lang.Object {



}

上面讲解了对象处于创建阶段时,系统所做的一些处理工作,其中有些过程与应用的性能密切相关,因此在创建对象时,我们应该遵循一些基本的规则,以提高应用的性能。

下面是在创建对象时的几个关键应用规则:

(1)避免在循环体中创建对象,即使该对象占用内存空间不大。

(2)尽量及时使对象符合垃圾回收标准。

(3)不要采用过深的继承层次。

(4)访问本地变量优于访问类中的变量。

关于规则(1)避免在循环体中创建对象,即使该对象占用内存空间不大,需要提示一下,这种情况在我们的实际应用中经常遇到,而且我们很容易犯类似的错误,例如下面的代码:

… …

for (int i = 0; i < 10000; ++i) {

Object obj = new Object();

System.out.println("obj= "+ obj);

}

… …

上面代码的书写方式相信对你来说不会陌生,也许在以前的应用开发中你也这样做过,尤其是在枚举一个Vector对象中的对象元素的操作中经常会这样书写,但这却违反了上述规则(1),因为这样会浪费较大的内存空间,正确的方法如下所示:

… …

Object obj = null;

for (int i = 0; i < 10000; ++i) {

obj = new Object();

System.out.println("obj= "+ obj);

}

… …

采用上面的第二种编写方式,仅在内存中保存一份对该对象的引用,而不像上面的第一种编写方式中代码会在内存中产生大量的对象应用,浪费大量的内存空间,而且增大了系统做垃圾回收的负荷。因此在循环体中声明创建对象的编写方式应该尽量避免。

另外,不要对一个对象进行多次初始化,这同样会带来较大的内存开销,降低系统性能,如:

public class A {

private Hashtable table = new Hashtable ();

public A() {

// 将Hashtable对象table初始化了两次

table = new Hashtable();

}

}

正确的方式为:

public class B {

private Hashtable table = new Hashtable ();

public B() {

}

}

不要小看这个差别,它却使应用软件的性能相差甚远,如下图所示。

来源:http://hi.baidu.com/wszfer/blog/item/e6aa75cc0e21fe1800e9281d.html

 

分享到:
评论

相关推荐

    java对象的 生命周期

    ### Java对象的生命周期详解 Java对象的生命周期是一个关键概念,涉及到对象从创建到销毁的整个过程。理解这一过程对于高效地编写和管理Java程序至关重要。 #### 创建对象的方式 对象的创建是生命周期的起点,...

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

    ### Java中对象的生命周期 #### 一、对象的生命周期概览 在Java中,对象的生命周期是指从对象被创建到最终被垃圾回收器回收这段时间。理解对象的生命周期对于有效地管理和优化Java应用程序至关重要。 #### 二、...

    java对象在内存中的结构

    Java对象在内存中的结构及其生命周期是Java编程中基础且关键的概念。Java的内存管理主要涉及栈(Stack)和堆(Heap)两个区域,对于理解程序的性能和内存使用至关重要。 首先,栈主要用于存储基本数据类型(如int, ...

    Java中类的生命周期

    ### Java中类的生命周期 #### 一、Java虚拟机与程序生命周期 在深入了解Java中类的生命周期之前,我们首先需要了解Java虚拟机(JVM)及其生命周期的概念。 **1. Java虚拟机启动** 当我们通过`java`命令运行一个...

    Java面向对象程序设计课后答案全解

    学习何时、如何以及为什么使用构造器是理解对象生命周期的关键。 6. **抽象类与接口**:抽象类用于定义一个通用的模板,不能被实例化,但可以被其他类继承。接口则提供了完全抽象的方法声明,是实现多继承的一种...

    java对象实体类属性字段对比变化过程

    Java对象实体类属性字段对比变化过程是指在一个Java对象实体类的生命周期中,其属性字段的变化情况。这种变化过程通常涉及到对象的创建、使用和销毁等阶段。 在对象的创建阶段,Java对象实体类会根据预设的属性字段...

    Java面向对象编程思想.pdf

    对象的生命周期包括声明、实例化和初始化三个方面的内容。对象的声明并不为对象分配内存空间,而是在实例化时分配内存空间。对象的初始化是通过构造函数来完成的,用于初始化对象的状态。 十、总结 Java 面向对象...

    JAVA面向对象程序设计(期末考试试题及答案)

    1. Java 语言的基本语法规则:变量声明、数据类型、运算符、控制结构、数组、方法等。 2. Java 中的基本数据类型:整型、浮点型、字符型、布尔型等。 3. Java 中的运算符:算术运算符、比较运算符、逻辑运算符、赋值...

    jni java传递对象到C

    1. **声明JNI函数**:在C/C++头文件中,我们需要声明一个JNI函数,该函数接受`JNIEnv`指针(提供访问Java虚拟机和Java对象的方法)以及`jobject`参数。 ```c JNIEXPORT void JNICALL Java_Package_Name_MethodName...

    java-学习-面对对象-匿名对象

    值得注意的是,由于匿名对象是临时的,所以它们不能被声明为`final`,因为`final`变量必须在声明时初始化,而匿名对象的生命周期在声明后立即结束。同样,由于没有名字,匿名对象也不能作为返回值。 在“14-面向...

    java中对象和对象引用的区别!

    这一点在Java中非常重要,因为它影响到了如何处理对象的复制以及对象的生命周期等问题。 - **空引用** 如果我们声明了一个引用变量但并未给它分配任何对象,那么这个引用变量就称为“空引用”或“未初始化的引用...

    JAVA_对象克隆

    在Java编程语言中,对象克隆是一种创建与现有对象具有相同数据的新对象的过程。这个过程在需要复制对象的所有属性而不创建...理解其工作原理和注意事项,能帮助开发者更有效地管理对象的生命周期,实现数据的安全复制。

    java对象引用易混解析

    ### Java对象引用详解 #### 一、Java对象与引用的基本概念 在Java中,对象是类的一个实例,而引用则是指向这些对象的变量。理解Java中的对象与引用之间的区别至关重要,因为这涉及到如何管理和操作对象。 #### 二...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     8.1 Java对象在JVM中的生命周期  8.2 理解Session的缓存  8.2.1 Session的缓存的作用  8.2.2 脏检查及清理缓存的机制  8.3 Java对象在Hibernate持久化层的状态  8.3.1 临时对象的特征  8.3.2 持久化对象的...

    Java面向对象程序设计教程PDF,完整的面向对象编程指南,大量习题便于自学。

    - **对象序列化**:Java对象可以通过序列化持久化到磁盘或在网络间传输。 9. **多线程** - **线程的创建与状态**:通过Thread类或实现Runnable接口创建线程,了解线程的生命周期和状态转换。 - **同步与互斥**:...

    Java调用c++类对象

    注意,由于内存管理在不同语言间可能存在差异,所以必须手动管理C++对象的生命周期,防止内存泄漏。 在完成C++的实现后,我们需要编译这个C++源文件为动态链接库,然后在Java中加载这个库,这样Java就可以通过JNI...

    think in java 第11章 持有对象

    以上就是《Think in Java》第11章“持有对象”中的核心知识点,理解并掌握这些概念对于深入理解和使用Java对象是非常重要的。通过实践和编程练习,你可以更好地领悟这些知识,并应用到实际项目中。

    《Java面向对象程序设计》(第版)课后答案.docx

    《Java面向对象程序设计》是一本深入探讨Java编程的书籍,尤其关注面向对象的概念和实践。课后答案提供了对书中理论知识和实践练习的解答,帮助读者巩固学习成果。 1. **Java创始人**:Java语言是由James Gosling...

    java面向对象

    变量的作用域和生命周期由其声明的位置决定,例如局部变量的作用域是声明它的代码块内。 6. Unicode字符集(Unicode characters): Java使用Unicode字符集来表示字符和字符串。Unicode提供了对世界上大多数语言的...

Global site tag (gtag.js) - Google Analytics