Java对象的生命周期与作用域的讨论(转)

时间:2021-09-23 10:19:52

导读:
  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一样,也可将其实现为单实例。
  
  
  
  Java对象的作用域
  作用域与生命周期的区别:
  作用域是对象起作用的地方,生命周期对象生存的时段,就JAVA来说,对象不被引用了也就OVER了。即生命周期定义的是时间,作用域定义的是空间。
  
  变量的生命周期和作用域
  Java允许在任何块中声明变量,(块:由‘{‘ 开始由‘}’ 结束) 。
  一个”块”定义一个作用域.作用域决定了哪些变量对程序的其他部分是可视的,同时还确定了这些对象的生命周期.
  定义作用域由一个方法和它的左’{‘开始,如果方法带有参数,那么它们也在方法的作用域之内。
  一般规则是:在一个作用域内声明的变量对外部的作用域定义的程序不可视(不可访问),因此,在一个作用域中声明变量时,就是在使变量本地化并受其保护而拒绝未经授权的
  访问和修改.其实,作用域规则为变量提供了封装的功能. 作用域可以嵌套,每次创建一个新的,嵌套的作用域,外部作用域就封入到内部作用域,这就意味着外部作用域声明的对象在内部作用域中的代码是可以访问的,反之则是不正确的。
  变量的作用域影响了其生命周期。进入到变量的作用域创建变量,离开变量的作用域则清除变量。也就是说变量离开了它的作用域则不再保存它的值.
  因此变量的生命周期受其作用域限制。
  
  Java对象的作用域
  作用域public,private,protected,以及不写时的区别
  答:区别如下:
  作用域 当前类 同一 package 子孙类 其他 package
  public √ √ √ √
  protected √ √ √ ×
  friendly √ √ × ×
  private √ × × ×
  不写时默认为friendly
  
  JavaBean作用域
  在Web应用中,JavaBean存储许多不同的属性集合中。每一个不同的属性集合都有不同的生命周期规则。该规则定义了生命周期和可见性我们称之为作用域(Scope),JSP定义的作用域如下:
  1.page Bean在当前请求的单个JSP页面可见(相当于Servlet的service方法中的局部
  变量)
  2.Request Bean不仅在单个页面可见,也可以在被页面包含(include)的页面或servlet
  中可见,或者转向(Forward)的页面可见。
  3.Session Bean在特殊用户session的所有JSP或Servlet中可见。
  4.Application Bean在WEB 应用中的所有JSP,或Servelt中可见。
  必须记住的是JSP和Servlet在同一个WEB应用*享同一组Bean。例如一个Bean在Servlet中存在request的属性中:
  MyCart mycart = new MyCart(...);
  request.setAttribute("cart", mycart);

Java对象的生命周期与作用域的讨论(转)的更多相关文章

  1. Java 对象的生命周期

    Java对象的生命周期 在Java中,对象的生命周期包含下面几个阶段: 1.      创建阶段(Created) 2.      应用阶段(In Use) 3.      不可见阶段(Invisib ...

  2. Java虚拟机(三)垃圾标记算法与Java对象的生命周期

    前言 这一节我们来简单的介绍垃圾收集器,并学习垃圾标记的算法:引用计数算法和根搜索算法,为了更好的理解根搜索算法,会在文章的最后介绍Java对象在虚拟机中的生命周期. 1.垃圾收集器概述 垃圾收集器( ...

  3. 【转载】Java对象的生命周期

    Java对象的生命周期 在Java中,对象的生命周期包括以下几个阶段: 1.      创建阶段(Created) 2.      应用阶段(In Use) 3.      不可见阶段(Invisib ...

  4. 《深入理解Java虚拟机》 Java对象的生命周期

    Java虚拟机运行时数据区 方法区:存储 类信息.常量.静态变量.即使编译器编译后的代码等数据,也有别名叫做非堆.  方法区其中有包含有 运行时常量池,用于存放编译期生成的各种字面量和符号引用.其中, ...

  5. Hibernate中Java对象的生命周期

    一个对象的出生源于我们的一个new操作,当我们使用new语句创建一个对象,这个对象的生命周期就开始了,当我们不在有任何引用变量引用它,这个对象就的生命就此结束,它占用的内存就可以被JVM的垃圾回收器回 ...

  6. Java 对象初始化生命周期

    class Man { String name; int age = 20; public static int sex = 1; Man(String name, int age) { //supe ...

  7. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  8. [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. java之hibernate之session中对象的生命周期

    1. session是用来执行对象的crud操作,并且session是对象事务工厂.session是线程级别的,所以生命周期比较短. 2.session中对象的生命周期图: 3.session中对象的 ...

随机推荐

  1. 8.4.2 Fresco

    Fresco是Facebook公司的黑科技:http://fresco-cn.org/ 真三级缓存,变换后的BItmap(内存),变换前的原始图片(内存),硬盘缓存.在内存管理上做到了极致.对于重度图 ...

  2. Java Hour 30 Weather ( 3 )

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. Hour 30 上回终点 Model 这里有一些java bean 的 风格约 ...

  3. android学习笔记28——Activity生命周期

    Activity生命周期 Activity的活动状态由android已Activity栈的形式管理,当前活动的Activity位于栈顶.随着不同应用的运行,每个Activity都有可能从活动状态转入非 ...

  4. (Problem 9)Special Pythagorean triplet

    A Pythagorean triplet is a set of three natural numbers, a  b  c, for which, a2 + b2 = c2 For exampl ...

  5. extract-text-webpack-plugin---webpack插件

    var ExtractTextPlugin=require('extract-text-webpack-plugin');//build使用 { test:/\.css$/, use:ExtractT ...

  6. hibernate4整合spring3出现java.lang.NoClassDefFoundError: [Lorg/hibernate/engine/FilterDefinition;

    解决办法 原先:<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annota ...

  7. Chrome F12调试

    F12 断点 F5 Esc 选择鼠标右击:编辑||hover样式 Sonrces go to file (ctrl+p) 搜搜文件名

  8. 31网络通信之Select模型

    多路复用并发模型  -- select #include<sys/select.h> #include<sys/time.h> int select(int maxfd,  f ...

  9. Java 设计模式系列(二二)责任链模式

    Java 设计模式系列(二二)责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求 ...

  10. onvif杂项

    onvif规范 中文介绍 什么是ONVIF ? ONVIF规范描述了网络视频的模型.接口.数据类型以及数据交互的模式.并复用了一些现有的标准,如WS系列标准等.ONVIF规范的目标是实现一个网络视频框 ...