Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 756|回复: 0

Java对象的生命周期分析.

[复制链接]

该用户从未签到

发表于 2011-8-1 21:54:23 | 显示全部楼层 |阅读模式
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)对象池工厂(ObjectPoolFactory)类

  该类主要用于治理相同类型和设置的对象池(ObjectPool),它一般包含如下两个方法:

  ?createPool:用于创建特定类型和设置的对象池;

  ?destroyPool:用于开释指定的对象池;

  同时为保证ObjectPoolFactory的单一实例,可以采用Singleton设计模式,见下述getInstance方法的实现:

public static ObjectPoolFactory getInstance() {
 if (poolFactory == null) {
  poolFactory = new ObjectPoolFactory();
 }
 return poolFactory;
}

  2)参数对象(ParameterObject)类

  该类主要用于封装所创建对象池的一些属性参数,如池中可存放对象的数量的最大值(maxCount)、最小值(minCount)等。

  3)对象池(ObjectPool)类

  用于治理要被池化对象的借出和归还,并通知PoolableObjectFactory完成相应的工作。它一般包含如下两个方法:

   ?getObject:用于从池中借出对象;
   ?returnObject:将池化对象返回到池中,并通知所有处于等待状态的线程;

  4)池化对象工厂(PoolableObjectFactory)类

  该类主要负责治理池化对象的生命周期,就简朴来说,一般包括对象的创建及销毁。该类同ObjectPoolFactory一样,也可将实在现为单实例。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-6-7 10:09 , Processed in 0.395946 second(s), 46 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表