快速业务通道

使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
putStream,PrintStream 等),创建并使用完毕后忘记 关闭 close(如清单 16),或者因为异常情况使得关闭 Stream 流的 close 的语句没有被 执行(如清单 17),这些都会导致 Stream 流相关的资源没有被释放,从而产生内存泄漏 。

建议的解决方法:

程序员编码时注意手动释放一些已经明确知道不再使用的对象。最简单的方法就是将其 置为 null,告诉垃圾回收器你已经不再引用他们,从而垃圾回收器可以替你回收这些对象 所占用的内存空间。

使用 Collection 类对象时(如 Hashtable,HashSet,HashMap,Vector 和 ArrayList 等),如果可以,尽量定义其为局部变量,减少外界对其的引用,增大垃圾回收器回收他们 的可能性。

使用 Collection 类对象时(如 Hashtable,HashSet,HashMap,Vector 和 ArrayList 等),注意手动 remove 其中不再使用的元素,减少垃圾对象的残留。

使用事件******时(event listener),记住将不再需要监听的对象从监听列表中解除 (remove)。

使用 Stream 流时,一定要注意创建成功的所有 Stream 流一定要在使用完毕后 close 关闭,否则资源无法被释放。

在 try / catch 语句中,添加 finally 声明,对 try 中某些可能因为异常而没释放的 资源进行释放。

在 class 中添加 finalize() 方法,手动对某些资源进行垃圾回收。

可以使用一些可以检测内存泄漏的工具,如 Optimizeit Profiler,JProbe Profiler, JinSight, Rational 公司的 Purify 等,来帮助找出代码中内存泄漏的错误。

其它技巧

使用 Iterator 时,一定要先调用 hasNext() 后,再调用 next(),而且不要在一个 Iterator 的 hasNext() 成功后,去调用另外一个 Iterator 的 next(),如清单 18 。

清单 18. 使用 Iterator 出错

Iterator firstnames = ( new Vector() ).iterator();   Iterator lastnames = ( new Vector() ).iterator();   while ( firstnames.hasNext() ) {    //firstnames 中存在下一个元素,但 lastnames 可能已经没有元素了   String name = firstnames.next() + "." + lastnames.next();   }

使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告(10)

时间:2011-05-07 IBM 丁钦浩

注意 switch 语句中是否缺少 break 。有的时候程序员有意让多个 case 语句在一次执 行,但是有的时候却是忘写 break,导致发生了意想不到的结果,如清单 19 。

清单 19. switch 语句中缺少 break

switch ( A )   {    // 程序员原本的意思是 A 为 0 时,B 为 0,A 为 1 时,B 为 1, 其实 B 永远都不可能为 0   case 0: B = 0;   case 1: B = 1; break;   }

注意避免恒正确或恒错误的条件,如清单 20 。

清单 20. 常见的恒正确或恒错误的条件

例 1:   if ( S.length() >= 0 ) // S 是 String 对象,它的长度永远大 于等于 0,条件恒正确 例 2:   // 程序员本来的意图是想介于 MIN 和 MAX 之间的值才成立,却误将”  && ”写成” || ”,导致条件恒成立   if ( x >= MIN || x <= MAX ) 例 3:   final boolean singleConnection = true;   // final 型的 singleConnection 永远为 true,所以该条件恒成立,而且  connect() 永远不会被执行   if ( singleConnection || connect() )

注意在 if 语句中是否少了 else 分支,如清单 21。

清单 21. if 语句中少了 else 分支

if ( S == “ d ” ) { … }   else if ( S == “ e ” ) { … }   else if ( S == “ v ”

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号