J2EE系统优化的几点体会

J2EE系统优化的几点体会(一、对象)

说到系统优化,是一个比较复杂的问题,涉及到软件的各个方面:需求、模块划分、数据库设计、程序编码以及一些特殊的优化方法如缓存技术等。而不同的应用又有其特殊的优化策略和技术。同时优化是贯穿系统从需求到实现再到维护的各个阶段的一项活动,而在各个阶段又有其不同的着眼点和具体方法。

本文立足于具体的J2EE项目实践,结合一些已有的优化条例,提出自己的一些体会,也算是作为一次对实际项目经验教训的总结。

优化一般意义上说是提高已有系统的性能,减少如内存、数据库、网络带宽等资源的占用,是在系统开发告一段落的前提下进行。一般是通过压力测试或具体使用发现性能方面的问题,然后寻找性能瓶颈,并结合项目进度、人员安排、技术储备等因素,提出相应的优化策略。

下面结合一些案例,进行具体的讨论,并希望能总结出一些具有代表性的条例:

条例一:尽量重用对象,避免创建过多短时对象

对象在面向对象编程中随处可见,甚至可以毫不夸张的说是:“一切都是对象”。如何更好的创建和使用对象,是优化中要考虑的一个重要方面。笔者将对象按使用分为两大类:独享对象和共享对象。独享对象指由某个线程单独拥有并维护其生命周期的对象,一般是通过new 创建的对象,线程结束且无其它对这个对象的引用,这个对象将由垃圾收集机制自动GC。共享对象指由多个线程共享的对象,各线程保持多个指向同一个对象的引用,任何对这个对象的修改都会在其它引用上得到体现,共享对象一般通过Factory工厂的getInstace()方法创建,单例模式就是创建共享对象的标准实现。独享对象由于无其它指向同一对象的引用,不用担心其它引用对对象属性的修改,在多线程环境里,也就不需要对其可能修改属性的方法加以同步,减少了出错的隐患和复杂性,但由于需要为每个线程都创建对象,增加了对内存的需求和JVM GC的负担。共享对象则需要进行适当的同步(避免较大的同步块,同时防止死锁)。

还有几种特殊对象:不变对象和方法对象。不变对象指对象对外不含有修改对象属性的方法(如set方法),外部要修改属性只能通过new新的实例来实现。不变对象最大的好处就是无需担心属性被修改,避免了潜在的bug,并能无需任何额外工作(如同步)就很好的工作在多线程环境下。如JDK的String对象就是典型的不变对象。方法对象简单的说就是仅包含方法,不含有属性的对象。由于没有对象属性,方法中无需进行修改属性的操作,也就能采用static方法或单例模式,避免每次使用都要new对象,减少对象的使用。

那么该如何确定创建何种对象,这就要结合对象的使用方式和生命周期、对象大小、构建花销等方面来综合考虑。如果对象生命周期较长,会存在修改操作,不能容忍其它线程对其的修改,就应该采用独享对象,如常见的Bean类。而如果对象生命周期较长,且能为各个线程共享,就可以考虑共享对象。共享有2种常见情况,一种是系统全局对象,如配置属性等,各个线程应该引用同一对象,任何对这个对象的修改都会影响其它线程;另一种是由于对象创建开销较大,各线程对此对象是瞬时访问,且无需再次读取其属性,如常见的Date 对象,一般这种对象的使用是瞬时的,比如把它format成String,如果每次创建然后等待GC就会浪费大量内存和CPU时间,较好做法就是做成共享对象,各个线程先set再使用,注意对进行set并访问的方法要同步。不变对象一般使用在对象创建开销较小(属性较少,类层次较少),且需要能自由共享的情形。如一个对象里的常量对象,使用public static final AAA=new AAA(…) 创建。方法对象使用较广,如Util类、DAO类等,这些对象提供操作其它对象(一般是bean对象)的接口,能对系统在层次和功能上进行解耦合。

J2EE系统优化的几点体会(二、循环)

时间: 2024-10-31 17:29:56

J2EE系统优化的几点体会的相关文章

J2EE系统优化的几点体会(一、对象)

说到系统优化,是一个比较复杂的问题,涉及到软件的各个方面:需求.模块划分.数据库设计.程序编码以及一些特殊的优化方法如缓存技术等.而不同的应用又有其特殊的优化策略和技术.同时优化是贯穿系统从需求到实现再到维护的各个阶段的一项活动,而在各个阶段又有其不同的着眼点和具体方法.本文立足于具体的J2EE项目实践,结合一些已有的优化条例,提出自己的一些体会,也算是作为一次对实际项目经验教训的总结.优化一般意义上说是提高已有系统的性能,减少如内存.数据库.网络带宽等资源的占用,是在系统开发告一段落的前提下进

.net 开发者学习 J2EE 的体会

问题描述 最近一直研究j2ee开发问题,咨询n多高手寻求指点,最终更加茫然,因为他们都给了我一大堆无法理解的名词术语,本人愚笨,立刻晕倒!什么"必须面向对象",什么DAO,什么struts,什么hibernate等,看来要学的东西太多了!这怎么还能有功夫喝java咖啡呢?!本人自认为是.net高手,在微软技术上从来无需费力,可到了j2ee,不知如何下手啊!于是发奋图强,搜罗万千网络世界,从一个单词一个单词研究,什么servlet,什么web.xml,什么POJO,什么jsp脚本,...

在J2EE中APPLET和HTML作为客户端的比较

j2ee|比较|客户端 前言 在j2ee中,客户端常用的两中方式是html,和基于application的applet,因为采用的技术不同,这两个方式都有其优缺点,在考虑采用何种技术(或者两种都用),需要根据两种技术的特点,以及此项目的应用范围来综合考虑.以下分"易用性","性能","维护,扩展","交互","安全"五部分来说明各自的特点,并针对客户,开发人员角色阐明一下个人观点. 易用性 客户对于易用性要

.NET和J2EE该相互学习什么?

j2ee [前言] 写这篇Post源于我既做过.NET开发又做过J2EE开发的经历.在这样的转变过程中,我对单一平台开发所带来的思维局限性有了很多清晰却零散的想法.在看了振河兄的页面间传递变量的方法及使用范围的讨论之后,我更能体会到在不同的平台进行开发,思维方式会是如此之不同,原来那些零散的想法也随之不断在脑海中涌现,让我有了写下这篇Post的冲动.其实我一直都在宣扬一种观点:技术之间是相通的,精于触类旁通,善于联想是我们程序员应有的优势.我们在专注.NET技术的时候,不妨在工作间隙休息的时候看

J2EE学习笔记(8) 真是知易行难 初试Struts

j2ee|笔记 实在是好事多磨,折腾了两个晚上才搞定了一个 HelloWorld Struts版,下面谈谈一点体会. 开发环境 Eclipse + MyEclipse (Struts 1.1) Struts 1.1支持多模块开发,在myEclipse的Web Application Project里先建立新module (New->Struts 1.1 Module),再依次加Form Action ActionForward (New -> Struts 1.1 Action, Form &

使用AppFuse快速构建J2EE应用

简介:本文以一个 J2EE 开发者的角度,借助一个简单的应用示例,在融合了个人经验的基础上介绍 了如何用 AppFuse 一步步地构建 J2EE 项目.通过阅读本文,读者不仅能够学会用 AppFuse 进行开发, 而且能够充分体会到 AppFuse 提供的"快速开发"的优越性. 关于 AppFuse的特性.架构以及为什么要使用 AppFuse,AppFuse的创始人 Matt Raible 在 <使用 AppFuse的七个理由>一文中已经做了很详尽的阐述,这里就不再赘言.本

J2EE平台架构上开发CRM的技术过程控制

第一章 概述 本文阐述了关于在J2EE平台上开发CRM应用系统的各方面内容,包括高辉本人对于CRM系统的理解,利用J2EE平台开发过程中要注意的一些技术深层的问题,开发分析中要注意的原则等等.这些都是作者在实际的工作中通过经验与教训所得来的.在工作中,我深刻的体会到系统分析员的重要性,尤其是对于以组件为主要开发对象的工程项目,系统分析员的技术与业务素质对于整个项目的成功与否起着非常关键性的作用. 需要说明的是,这并非作者工作文档,而仅仅是一篇分享经验与教训的交流文档,因此,其中关于一些涉及到具体

【超全整理】J2EE集成开发环境MyEclipse使用心得汇总

一.首先我们为什么需要MyEclipse? 下面允许我做一些简要的介绍: 应该大家都知道另一个MyEclipse的近亲--Eclipse的优点:免费.程序代码排版功能.有中文汉化包.可增设许多功能强大的外挂.支持多种操作系统(Windows. Linux.Solaris.Mac OSX)等等. 而 MyEclipse企业级工作平台(MyEclipse Enterprise Workbench ,简称MyEclipse)是对Eclipse IDE的扩展,利用它我们可以在数据库和J2EE的开发.发布

.NET和J2EE该相互学习什么

[前言] 写这篇Post源于我既做过.NET开发又做过J2EE开发的经历.在这样的转变过程中,我对单一平台开发所带来的思维局限性有了很多清晰却零散的想法.在看了振河兄的页面间传递变量的方法及使用范围的讨论之后,我更能体会到在不同的平台进行开发,思维方式会是如此之不同,原来那些零散的想法也随之不断在脑海中涌现,让我有了写下这篇Post的冲动.其实我一直都在宣扬一种观点:技术之间是相通的,精于触类旁通,善于联想是我们程序员应有的优势.我们在专注.NET技术的时候,不妨在工作间隙休息的时候看看.NET