导读:
  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. Mybatis中的基本对象的生命周期和作用域

    不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题 SqlSessionFactoryBuilder 这个类可以被实例化.使用和丢弃,一旦创建了 SqlSessionFact ...

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

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

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

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

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

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

随机推荐

  1. p2p_server

    以太坊系列之十九 对p2p模块server的理解 type transport interface { // The two handshakes. doEncHandshake(prv *ecdsa ...

  2. 「TJOI2013」循环格

    题目链接 戳我 \(Solution\) 我们观察发现循环格要满足每个点的入度都为\(1\) 证明: 我们假设每个点的入读不一定为\(1\),那么必定有一个或多个点的入度为0,那么则不满足循环格的定义 ...

  3. 【题解】 UVa11300 Spreading the Wealth

    题目大意 圆桌旁边坐着\(n\)个人,每个人有一定数量的金币,金币的总数能被\(n\)整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数量相等.您的任务是求出被转手的金币的数量的最小值. ...

  4. c++类 初始化另一对象

    Cbox类中对象a  可以直接赋值给对象b,无论类中数据成员是私有还是共有.且在创建a时调用了一次构造函数,b调用的是另外的默认构造函数: #include<iostream> using ...

  5. Oracle大字段(clob)模糊查询优化方法

    对于内容很多的时候clob打字段模糊查询很慢,整理一个小方法: 1,在查询的列上建索引 2,对于要查询的clob字段使用一下语句创建索引   CREATE INDEX idx_zs_info_note ...

  6. openvpn的搭建与应用

    一.VPN概述: VPN(Virtual Private NetWork,虚拟专用网络)架设在公共共享的基础设施互联网上,在非信任的网络上建立私有的安全的连接,把分布在不同地域的办公场所.用户或者商业 ...

  7. kali linux之被动信息收集recon-ng

    开源的全特性的web侦查框架,基于python开发 命令格式与msf一致 使用方法:模块,数据库,报告 -h 帮助信息 -v 版本信息 -w 进入工作区,如果没有此工作区,则创建该工作区 -r 批量的 ...

  8. VS2017+DLib_19.17详细配置教程

      最近学校布置了一个关于图像融合的作业,于是想利用Learn OpenCV 网站上的Face Morph 教程来设计一个人脸融合的Gif图,但是程序中需要用到DLib库,光是配置这个库就花费了我半天 ...

  9. Python如何在子类里扩展父类的property?

    <python cookbook>8.8节讨论子类扩展property时,一开始都晕了,思考了半天才勉强弄懂一点,赶快记下来.废话不多说,先上代码: class Person: def _ ...

  10. Deploy Flask app to Apache on Windows

    内容已过期,分割线以下为原文存档. 故事背景 这次我需要将一个Flask应用部署到本地的Windows服务器上.操作系统是64位的,程序是基于Python 3开发的,大体就是这样. 部署选项 根据Fl ...