【java】itoo项目实战之常被忽视的性能优化

Itoo V3.0很快就要结束了,功能上基本上开发完成了,但是放到jboss中部署的时候,使用时感觉特别的慢,如果是数据量多的话,就把慢这个词发挥到了极致.这个慢的问题有大部分是因为基础系统中使用了JPA级联导致的,每次查询的时候,只要有关联的表,都会全部查询出来,一下发出一大版的HQL
语句,看着也是挺吓人的.出来优化JPA级联问题,还可以从代码中下手,从以下的几个方面考虑.

(1)减少对象生命周期

对象的生命周期有这么一个计算公式:对象生命周期=销毁时间-创建时间

实际上减少对象生命周期有2个途径:尽早地销毁对象和尽量晚地创建对象.大多数人都只注意尽早地销毁对象,但是却很少人注意尽量晚地创建对象。特别是耗费内存比较大的对象应该尽量晚地被创建。只有真正需要的时候才开始创建它.除了对象以外,比如连接数据库。只有所有准备就绪的时候,才再连接数据库,使用完成数据库连接就立刻关闭。最短时间使用连接,包括数据流也一样

(2)线程启动得越早越好

当准备线程的工作都已经好了以后,创建线程,就要马上启动线程,线程启动得越早越能提前获取数据

(3)用字符代替单字符串

StringBuilderstr=new StringBuilder();

那么str.append("m")不如str.append(‘m‘)快

(4)StringBuilder可以连续增加

StringBuilder的append方法返回自身可以继续增加,无需重新获取StringBuilder对象

StringBuilderstr=new StringBuilder();
str.append("abc");
str.append("ddd");

可以写成

StringBuilderstr=new StringBuilder();
str.append("abc").append("ddd");

(5)无顺序遍历数组

其实有的时候遍历数组无关顺序,只需要把数组对象都遍历一遍即可

通常写法是

int[] a=newint[10000];
for(inti=0,len=a.length;i<len;i++){
    int b=a[i];
          //然后处理
}

其实我在无关顺序遍历数组的时候我这么写:

int[] a=newint[10000];
for(inti=-1,len=a.length;++i<len;){
    int b=a[i];
           //然后处理
}

有的时候这么写

int[] a=newint[10000];
for(inti=a.length;i>0;){
    int b=a[--i];
           //然后处理
}

充分利用++i或者--i.最后一个不用计算len,直接--i可以取值,比较的时候与常数0比较

(6)不要有多余的操作

Stringa=getA(),b=getB();
if(a!=null&&b!=null){
}

最好为

String a=getA();
if(a!=null){
     String b=getB();//这样a为null,就不需要获取b了。
     if(b!=null){
     }
}

还有像

if(getValue()!=2&&getValue()!=0){
...
}

直接写为

intvalue=getValue();
if(value!=2&&value!=0){
...
}

要调用方法浪费性能,其次是访问对象属性,最快是局部变量,利用下标访问数组系统还要判断越界问题也浪费性能.

(7)还有一些数组复制用‘system.arraycopy (),还有使用局部变量要比使用全局变量快。大家可以看不变性的String类源代码就知道了

(8)关于锁java有读写锁还有尝试获取锁的功能,可以参看ReadWriteLock类

(9)出现内存泄露,分析发现全局GC(Gabage Collection)频繁时,可以考虑检查代码中大List、Map、数组等处,使用相应的clean方法,减轻GC压力,提高GC效率。

(10)io操作频繁时,在finally代码中一定把outputStream.flush掉,在Web应用中尤其如此

全心全意为人名服务的软件,就不能让客户等待太久.

时间: 2024-10-13 13:45:58

【java】itoo项目实战之常被忽视的性能优化的相关文章

【java】itoo项目实战之大数据查询之使用 new map 优化hibernate之级联查询

在我的上一篇博客<[java]itoo项目实战之hibernate 懒加载优化性能>中,我曾提到过学生数据有2万条,查询数据十分的慢,这是让人很受不了的事情,看着页面进度条一直转着圈圈,那种着急的感觉真的没法形容.最开始考虑着使用lazy 来优化,因为前台框架的原因,lazy 优化并没有起到什么左右,后来就想着有select new map 优化.我先来画画关于查询学生的级联树 这个树的意思就是查询学生的时候它的深度是4级. 在没有优化之前,使用的是hibernate的hql 语句:From

【java】itoo项目实战之优化后具体代码

在我的前一篇博客中<<itoo项目实战之减少IO读写的导入思路>>,我介绍了如何完成减少IO读写的Excel导入,在这里我就把具体的代码实现分享给大家: 我就按照这张图的顺序给大家分享. 检查Excel 数据是否重复的代码: <span style="font-family:Times New Roman;font-size:18px;">// 2.从指定列中寻找重复行 for (int i = 1; i < realRows - 1; i++

Java Drp项目实战——Drp知多少

是什么 Drp是Distribution Resource Planning的缩写,意思是分销资源计划,它是用来管理企业的运行于Internet上的分销网络的系统,是以商业流程优化为基础,它的核心是销售和库存总和控制.这个分销系统或者说是分销体系,它的使用者包括一个大型企业的内部.各个分公司.各级分销商等,它的作用就在于即时的掌握各地的销售信息流.财务资金流.库存信息等一些功能. 产生背景是什么 知道了Drp是什么,我们还需要了解下它的开发背景是什么,为什么要开发这样的一个系统呢. 这个原因还是

JAVA Drp项目实战—— Unable to compile class for JSP 一波三折

交代下背景,电脑系统是64位的,用的是64位的Tomcat,安装是32位的Myeclipse10,java环境也是32位的,Tomcat在开始启动时会报这样一个错误,"Can't load IA 64-bit .dll on a AMD32-bit platform",但是不耽误使用,最近在敲Drp项目中用到了底层接口的几个方法,这个错误导致项目不能正常运行了,所以就将64位的Tomcat换成了与java环境一样的32位的Tomcat,上面的问题就顺利解决了,于是继续自己的开发,但是当

【java】itoo项目实战之java Web 中web的作用

在ITOO中,每个war包下的web.xml都是一样的.它的结构如下: itoo中含有多个war包,而且每个war包中web.xml都和上图的结构一样,而且配置内容都是一样的. 在Javaweb 应用中可以包含HTML 文档,Servlet,JSP和相关java类等,为了Servlet容器能够顺利地找到javaWeb 应用中的各个组件,Servlet规范规定,javaWeb应用必须采取固定的目录结构,即每种类型的组件在Web应用中都有固定的存放目录.Servlet规范还规定,javaWeb应用的

【java】itoo项目实战之百万数据查询优化收集与实践

1.对查询进行优化,应考虑在where 及 order by 涉及的列上建立索引. 2.应尽量避免在where 子句中对字段进行 null值判断,如:        select id from t wherenum is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select idfrom t where num=0 3.应尽量避免在where 子句中使用!=或<>操作符. 4.应尽量避免在where 子句中使用 or 来连接条件,如: selec

【java】itoo项目实战之hibernate 批量保存优化

在itoo中.基本上每一个系统都有一个导入功能,大量的数据填写进入excel模板中.然后使用导入功能导入的数据库中,这样能够大大的提高工作效率. 那么导入就涉及到了批量保存数据库的问题了. 那么通常情况下,在一个Session对象的缓存中数量有限的持久化对象,等到Session对象处理事务完成,还要关闭Session对象,从而及时释放session的缓存占用的内存.在批量保存1万条数据,假设一次性把须要保存的1万条数据载入到内存职工,当运行事务提交的时候,就会清理缓存,hibernate运行1万

【java】itoo项目实战之hibernate 懒加载优化性能

在做itoo 3.0 的时候,考评系统想要上线,就开始导入数据了,只导入学生2万条数据,但是导入的速度特别的慢,这个慢的原因是因为导入的时候进行了过多的IO操作.但是导入成功之后,查询学生的速度更加慢,因为底层用了hibernate的hql语句进行查询的,学习过hibernate的人都知道,如果hibernate不设置懒加载的话,只有是有关联的数据都会一次性全部都查询出来,我试了试,查询2万条数据,最深的级联查询是有5层,然后发出来的语句是460条,时间大概是10s.然后就考虑使用lazy进行优

【java】itoo项目实战之hibernate 懒载入优化性能

在做itoo 3.0 的时候,考评系统想要上线,就開始导入数据了,仅仅导入学生2万条数据,可是导入的速度特别的慢.这个慢的原因是由于导入的时候进行了过多的IO操作.可是导入成功之后,查询学生的速度更加慢.由于底层用了hibernate的hql语句进行查询的,学习过hibernate的人都知道,假设hibernate不设置懒载入的话,仅仅有是有关联的数据都会一次性所有都查询出来,我试了试.查询2万条数据,最深的级联查询是有5层,然后发出来的语句是460条,时间大概是10s.然后就考虑使用lazy进