WEB开发网
开发学院软件开发Java 使用 IBM 静态工具优化 Java 代码,第 2 部分: 分... 阅读

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

 2010-01-11 00:00:00 来源:WEB开发网   
核心提示: publicclassBufferLeakDemo{privatebyte[]readBuffer;publicvoidreadFile(StringfileName){Filef=newFile(fileName);intlen=(int)f.length();//readBuffer的长度只

 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 中 
   } 
 } 

在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 ) { 
  // 对异常情况进行处理 
 } 
 } 

上一页  5 6 7 8 9 10 

Tags:使用 IBM 静态

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接