Java Programming tricky Skills

原创 2004年11月02日 13:22:00

  性能问题已经日益受到越来越多的重视,由于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

Build Your Programming Technical Skills

Build Your Programming Technical Skills[编辑] 这是一篇由新手和我这个老家伙根据我们的经历完成的文章。 我的这个朋友把这篇文章取名叫Build Your P...
  • mad2man
  • mad2man
  • 2014年03月20日 10:32
  • 1134

Java_Web_Skills

https://github.com/Kevinsss/mind_map/blob/master/Java_Web_Skills.jpg
  • u010689306
  • u010689306
  • 2016年06月24日 12:49
  • 299

codeforces #30E Tricky and Clever Password KMP+Manacher+二分

题目大意:给定一个字符串SS,要求分成A+prefix+B+middle+C+suffixA+prefix+B+middle+C+suffix6段,满足: |A|=|C||A|=|C| |B||B...
  • PoPoQQQ
  • PoPoQQQ
  • 2015年05月13日 17:50
  • 2458

coderforce 598A. Tricky Sum(math)

题意:计算1-n的和规则:如为2的次方,则sum-=i,否则为sum+=i;最后求sum; 解:可以把1-n的和全部求出来,再减去其中为2的次方数的2倍就是sum; #include #inclu...
  • zyx520ytt
  • zyx520ytt
  • 2015年11月15日 17:44
  • 340

Tricky and Clever Password 【KMP+Manacher】【蓝桥杯试题】

问题描述   在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽。对他来说是,这不可接受的。因此,他发明了一种密码,好记又难以破解。后来,他才知道这种密码是一个长度...
  • u014641529
  • u014641529
  • 2016年05月06日 20:26
  • 1332

codeforces 30E 蓝桥杯 Tricky and Clever Password

算法训练 Tricky and Clever Password   时间限制:2.0s   内存限制:256.0MB      问题描述   在年轻的时候,我们故事中的...
  • tanmlh
  • tanmlh
  • 2016年02月18日 11:20
  • 2098

Acquire Basic Programming Skills

Acquire Basic Programming Skills 掌握基础编程技巧 The Foundation framework, as its name suggests, is...
  • Lovegarfield
  • Lovegarfield
  • 2012年05月17日 10:42
  • 957

How To Improve Programming Skills

http://www.c2.com/cgi/wiki?HowToImproveProgrammingSkills
  • wenbing043
  • wenbing043
  • 2009年07月04日 20:14
  • 81

To improve your programming skills

ten tips from http://www.antoarts.com/10-ways-to-improve-your-programming-skills/?utm_medium=refer...
  • peibaoyi
  • peibaoyi
  • 2013年05月15日 21:36
  • 443

Coderforce 598A Tricky Sum (数学)

题意:求数字之和,但是要减去2的倍数 思路:直接求... #include #include #include #include #include #include using namespac...
  • qq_21057881
  • qq_21057881
  • 2016年01月28日 15:20
  • 585
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java Programming tricky Skills
举报原因:
原因补充:

(最多只允许输入30个字)