使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告
2010-01-11 00:00:00 来源:WEB开发网 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 ) {
// 对异常情况进行处理
}
}
更多精彩
赞助商链接