A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余海龙 黑马帝   /  2012-2-12 22:06  /  1908 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余海龙 于 2012-2-13 21:13 编辑

当一个类在堆内存中创建一个对象后,说一下这个对象的存活期?

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

6 个回复

倒序浏览
如果对象在某个方法当中被创建,对象会在方法执行一次完毕后被释放,
如果对象是在类的全局中被创建,该对象会随着类的加载而存在,类的销毁而销毁

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
当一个对象没有被任何程序引用时,就是垃圾了,垃圾回收机制会定时的将他们清除.
比如:
void Test()
{
  Person p=new Person();
。。。
}
在Test方法运行时p一直指向new出来的对象,所以Test方法没有结束,这个对象就一直有指向,当Test方法结束后,这个对象就被垃圾监视器视为垃圾,并在适当的时候将其销毁释放。
而当是一个匿名对象时,比如:
new Person().getName();
在getName()这个方法返回之后,该匿名对象就被析构,他的生命周期就是当前这一行。
析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
对象存活不一定。在类中创建另外一个类的对象时,该对象建立。但是随着使用完成,可能很多人认为该对象已经被放弃或者销毁掉了。其实不然,在java中的垃圾回收机制如果没有及时的将对象回收或者用户自己进行清除,该对象依然还在。

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1 呵呵技术分够了啊呵呵。。

查看全部评分

回复 使用道具 举报
Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除。因此,对象的生命周期长度可用如下的表达式表示:T = T1 + T2 +T3。其中T1表示对象的创建时间,T2表示对象的使用时间,而T3则表示其清除时间。由此,我们可以看出,只有T2是真正有效的时间,而T1、T3则是对象本身的开销。下面再看看T1、T3在对象的整个生命周期中所占的比例。

  我们知道,Java对象是通过构造函数来创建的,在这一过程中,该构造函数链中的所有构造函数也都会被自动调用。另外,默认情况下,调用类的构造函数时,Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和double变量设置成0.0,逻辑值设置成false。所以用new关键字来新建一个对象的时间开销是很大的,如表1所示。

  表1 一些操作所耗费时间的对照表

运算操作 示例 标准化时间  
本地赋值 i = n 1.0  
实例赋值 this.i = n 1.2  
方法调用 Funct() 5.9  
新建对象 New Object()  980  
新建数组 New int[10]  3100  

  从表1可以看出,新建一个对象需要980个单位的时间,是本地赋值时间的980倍,是方法调用时间的166倍,而若新建一个数组所花费的时间就更多了。

  再看清除对象的过程。我们知道,Java语言的一个优势,就是Java程序员勿需再像C/C++程序员那样,显式地释放对象,而由称为垃圾收集器(Garbage Collector)的自动内存管理系统,定时或在内存凸现出不足时,自动回收垃圾对象所占的内存。凡事有利总也有弊,这虽然为Java程序设计者提供了极大的方便,但同时它也带来了较大的性能开销。这种开销包括两方面,首先是对象管理开销,GC为了能够正确释放对象,它必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等。其次,在GC开始回收“垃圾”对象时,系统会暂停应用程序的执行,而独自占用CPU。

  因此,如果要改善应用程序的性能,一方面应尽量减少创建新对象的次数;同时,还应尽量减少T1、T3的时间,而这些均可以通过对象池技术来实现。


评分

参与人数 1技术分 +2 收起 理由
唐秀启 + 2 加油!!

查看全部评分

回复 使用道具 举报
本帖最后由 最初的理想 于 2012-2-14 16:30 编辑
1毫秒的价值 发表于 2012-2-12 22:46
当一个对象没有被任何程序引用时,就是垃圾了,垃圾回收机制会定时的将他们清除.
比如:
void Test()


析构函数不是c++中的么,java没有这一说法吧,类似作用的是finalize函数,它是被gc负责调用的,并且不一定调用。
回复 使用道具 举报
吴超 金牌黑马 2012-2-14 18:13:34
7#
java完全采用动态内存分配方式,每当想要创建对象,就要使用new关键字来构建此对象的动态实例
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马