CSDN博客

img lovelypipi

Java Programming tricky Skills

发表于2004/11/2 13:22:00  652人阅读

  性能问题已经日益受到越来越多的重视,由于Java 本身具有垃圾回收机制,并不需要程序员象C一样维护内存,因此在早期过程中,很多程序员认为不会存在内存泄漏的问题,于是在编程过程中随意使用各种对象,其实这样将给程序带来潜在的难以发现的性能代价与维护代价,这里列出了一些经常出现的问题:

1) 释放不用的对象:参见《java内存泄漏》,了解JVM的工作原理及机制规范;
Arraylist al = new Arraylist();
for(int i = 0;i<200;i++){
 Object o = new Object();
 o.name = 1;
 o.id = 1;
 al.add(o);
}
以上代码中o仍被al引用,没有释放,不会被回收。因此需修正:
Arraylist al = new Arraylist();
for(int i = 0;i<200;i++){
 Object o = new Object();
 o.name = 1;
 o.id = 1;
 al.add(o);
 o = null;
}
例:实例一:没有正确实现pop方法的ObjStack
class ObjStack
{
private Object[] stack;
private int index;
public void push(Object o)
{
stack[index] = o;
index++;
}
public Object pop()
{
index-;
return stack[index];
}
//...
}
现在创建一个容量为10的对象,然后调用8次push方法向它添加对象,那么此时索引值为8。
现在考虑三次调用pop方法后发生什么?此时的索引值为5,但是请注意,除了这个索引值发生变化外堆栈其实没有其它任何变化!
虽然pop方法减小了索引值,但是实际上堆栈仍然保持着对那些对象的引用。调用pop方法往往意味着那些对象应该被收集(大多情况是如此的,即使不是马上,也是在稍后使用完该对象后)。然而由于堆栈仍然保留有对该对象的引用,它就不能被收集。这些对象只能在调用push后被替换才可能被收集。正确的pop的实现如下:
public Object pop()
{
index-;
Object o = stack[index];
stack[index] = null;
return o;
}
在这个版本的pop方法中,当引用被返回后,堆栈删除对他们的引用因此垃圾收集器在以后可以回收他们。
在你自己的编码中,对于那些不需要的对象,不要在引用它们!程序的执行极大收到可用内存的影响,可用内存越少,那么垃圾收集的执行次数越多,这将极大的伤害性能。
2) String字符串连接
String无法改变长度,+符号的连接解释采用StringBuffer对象实现,导致产生多个对象,因此采用stringBuffer.append()方法进行字符串连接;
3) 改变代码结构,从JAVA编译实现角度考虑
如:for(int I=0; I<v.size(); I++) {
       System.out.println( v.get(I).getClass().toString());
}

int size = v.size(); for(int I=0; I<size; I++) {
System.out.println( v.get(I).getClass().toString());
}
前者中v.size()方法需要调用v.size()次,程序运行需要花费调用方法的开销,JVM需要配置及清除堆栈环境。
4) Statement:尽量使用PreparedStatement(预编译),不会在执行时才传入SQL语句,并保证了SQL语句的重用性

5)在页面跳转后,加return语句,避免跳转失败;

6) 数据库连接在打开使用完毕后,一定关闭。采用有始有终"来提倡这种思想。每个方法都要负责把它获得的资源释放掉。见http://www-900.ibm.com/developerWorks/cn/java/j-diag/part11/index.shtml(splitCleaner错误模式:)
模式:Split Cleaner
症状:程序没能正确地管理资源,表现为泄漏或过早地释放了它们。
起因:程序的一些执行路径没有做到它们应该做的工作:释放资源正好一次。
治疗和预防措施:把负责释放资源的代码移到获得资源的同一方法中。
如:conn.getconnection(); conn.close()需在同一方法体中完成;
7)在Finally方法中关闭连接
8)处理关闭连接失败的异常,打印或记录日志中足够详细信息(包括时间、来源、问题描述,可能解决方案)以便查找。

Resource:
1) Inside Java Virtual Machine
2)Java Performance Tools: JProbe, Optimizer

阅读全文
0 0

相关文章推荐

img
取 消
img