日期:2014-05-19  浏览次数:20630 次

性能调优之七:J2EE后台程序调优

调优原则:

1、 减少数据库访问次数

(1) 使用数据缓存的存取方式


(2) 使用批量处理的方式

?

2、 减少SQL语句的执行时间

(1) 使用占位符的访问方式

?

(2)?优化SQL的执行计划(比如使用数据库索引或者调整SQL)


3、 减少程序执行的时间

(1) 使用异步调用代替同步调用

?

(2) 使用本地API方式代替远程调用(比如WebSerivce)

?

(3) 减少同步块或者同步方法的使用

?

(4) 减少IO读写

?

4、减少请求压力

(1) 使用应用集群部署方式分担掉服务器的压力

?

(2) 将静态文件和动态文件分离部署,减少J2EE容器的压力

?

?

高效Java编程注意事项

?

1、尽量避免不必要的方法调用

原则:在Java中,一切都是对象,如果有方法(Method)调用,处理器先要检查该方法是属于哪个对象,该对象是否有效,对象属于什么类型,然后选择合适的方法并调用。尽可能在外层确定是否一定要执行该方法。

示例:

?

?

public void CallMethod(int i ){
 if( i ==0 ){
  return;
 }
 ... // 其他处理
}

int i = 0;
...
CallMethod(i);
改为:
int i = 0;
...

if( i ==0 ){
 CallMethod(i);
}
?

?

?

2、尽量避免不必要的对象创建

原则:当一个对象是用new进行初始化时,其构造函数链的所有构造函数都被调用到,所以new操作符是很消耗系统资源的,new一个对象耗时往往是局部变量赋值耗时的上千倍。同时,当生成对象后,系统还要花时间进行垃圾回收和处理。尽量少用new来初始化一个类的实例, 当new创建对象不可避免时,注意避免多次的使用new初始化一个对象,尽量在使用时再创建该对象。

示例:

NewObject object = new NewObject();
int value;
if(i>0 )
{
 value =object.getValue();
}
?可以修改为:

?

int value;
if(i>0 )
{
 NewObject object = new NewObject();
 Value =object.getValue();
}
?
3、尽量减少对变量的重复计算体
原则:循环是比较重复运行的地方,如果循环次数很大,循环体内不好的代码对效率的影响就会被放大而变的突出。当有较大的循环时,应该检查循环内是否有效率不高的地方,寻找更优的方案加以改进。
示例:
Vector vect = new Vector(1000);
...
for( int i=0; i<vect.size(); i++){
 ...
}
?可以修改为:
int size = vect.size();
for( int i=0; i>size; i++){
 ...
}
?注意:如果size=1000,就可以减少1000次size()的系统调用开销,避免了循环体重复调用。


4、生成对象时,分配合理的空间和大小
原则:Java中的很多类都有它的默认的空间分配大小,对于一些有大小的对象的初始化,应该预计对象的大小,然后使用进行初始化。

示例:
StringBuilder builder = new StringBuilder(100);

当声明Vector vect=new Vector()时,系统调用:
public Vector() {// 缺省构造函数
 this(10); // 容量是 10;
}
缺省分配10个对象大小容量。当执行add方法时扩充容量。

5、使用StringBuilder代替String
原则:String是用来存储字符串常量的,如果要执行“+”的操作,系统会生成一些临时的对象,并对这些对象进行管理,造成不必要的开销。如果字符串有连接的操作,替代的做法是用StringBuilder的append方法,StringBuffer是有同步机制的,效率上没有StringBuilder快。

6、控制查询返回的结果条数
原则:当查询返回的数据量过大时,通过截取前面100条的数据返回,不然将严重影响系统的响应时间。

7、多线程不能使用HashMap
原则:HashMap没有同步机制,用于多线程的频繁读写会产生线程死锁的情况。推荐使用ConcurrentHashMap来代替HashMap,在初时化时尽量传入大小容量。

8、不要在循环中使用try…catch
原则:在循环中使用try…catch的话会造成多次异常判断逻辑,尽量做到一个方法最多只有一个try…catch块。

9、使用高效的HashMap的遍历
效率的遍历方式::
Map map = new HashMap(); 
Iterator iter = map.keySet().iterator(); 
while (iter.hasNext()) { 
  Object key = iter.next(); 
  Object val = map.get(key); 
}

??高效率的遍历方式:
Map map = new HashMap(); 
Iterator iter = map.entrySet().iterator(); 
while (iter.hasNext()) { 
  Map.Entry entry = (Map.Entry) iter.next(); 
  Object key = entry.getKey(); 
  Object val = entry.getValue(); 
}