快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
eakDemo   {   static Vector<String> v = new Vector<String>();   void leakingVector( int num ) {   for( int i = 0; i < num; i++ ) {   v.add( String.valueOf(i) );   }   // 虽然进行了 remove,但是却没有移除干净   for( int i = num - 1; i > 0; i-- ) {   v.remove( i );   }   }   }

每次调用 leakingVector 都会少 remove 一个 String 元素,如果 Vector 中的元素不 是 String,而是数据库中一些非常大的记录(record),那么不停调用 leakingVector 将 很快导致内存耗光。

清单 15. 内存泄漏的 Buffer

public class BufferLeakDemo   {     private byte[] readBuffer;     public void readFile( String fileName ) {       File f = new File( fileName );       int len = (int)f.length();       //readBuffer 的长度只增不减        if ( readBuffer == null || readBuffer.length < len )  {          readBuffer = new byte[len];       }       readFileIntoBuf( f, readBuffer );     }     public void readFileIntoBuf( File f, byte[] buffer ) {       // 将文件内容读取到 buffer 中     }   }

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

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

在BufferLeakDemo 对象的生命周期中,一直会有一个 readBuffer 存在,其长度等于读 到的所有文件中最长文件的长度,而且更糟糕的是,该 readBuffer 只会增大,不会减小, 所以如果不停的读大文件,就会很快导致内存泄漏。

清单 16. 内存泄漏的 Stream 流 1

public void writeFile( String fileName ) {   OutputStream writer = null;   writer = new FileOutputStream(fileName);      // 接下来对 writer 进行操作,但是结束后忘记关闭 close   }

文件输出流 FileOutputStream 使用完了没有关闭,导致 Stream 流相关的资源没有被 释放,内存泄漏。

清单 17. 内存泄漏的 Stream 流 2

public void writeFile( String srcFileName, String dstFileName )  {   try {   InputStream reader = new FileInputStream( srcFileName );   OutputStream writer = new FileOutputStream( dstFileName );   byte[] buffer = new byte[1024];      // 将源文件内容读入到 buffer 中   reader.read(buffer);   // 将 buffer 中的数据写入到目的文件中   writer.write(buffer);   reader.close();   writer.close();   } catch ( Exception e ) {    // 对异常情况进行处理    }   }

如果 reader 读取文件时 InputStream 发生异常,那么 writer 将不会被关闭,从而导 致内存泄漏。

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

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

总结:

一些 Collection 类,如 Hashtable,HashSet,HashMap,Vector 和 ArrayList 等, 程序员使用时一般容易忘记 remove 不再需要的项(如清单 13),或者虽然 remove,但是 remove 的不干净(如清单 14),这些都可能会导致无用的对象残留在系统中,这样的程序 长时间运行,可能会导致内存泄漏。特别是当这些 Collection 类的对象被声明为 static 时或存活于整个程序生命周期时,就更容易导致内存泄漏。

有些 buffer 在其生命周期中有时可能会很大,大到有可能导致内存泄漏(如清单 15) 。

使用 Stream 流时(如 FileOut

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号