使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告 - 编程入门网
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
使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告(8)时间:2011-05-07 IBM 丁钦浩在BufferLeakDemo 对象的生命周期中,一直会有一个 readBuffer 存在,其长度等于读 到的所有文件中最长文件的长度,而且更糟糕的是,该 readBuffer 只会增大,不会减小, 所以如果不停的读大文件,就会很快导致内存泄漏。 清单 16. 内存泄漏的 Stream 流 1
文件输出流 FileOutputStream 使用完了没有关闭,导致 Stream 流相关的资源没有被 释放,内存泄漏。 清单 17. 内存泄漏的 Stream 流 2
如果 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |