使用 IBM 静态工具优化 Java 代码,第 2 部分: 分析错误报告
2010-01-11 00:00:00 来源:WEB开发网清单 13. 内存泄漏的 Hashtable
public class HashtableLeakDemo
{
static Hashtable<Integer, String> names = new Hashtable<Integer, String>();
void leakingHash( int num ) {
for( int i = 0; i < num; i++ ) {
names.put( new Integer(i) , "developerWorks");
}
// 接下来是继续对 names 哈希表进行的操作,但是忘了移除其中的表项
}
}
leakingHash 会往 Hashtable 中不停地加入元素,但是却没有相应的移除动作(remove),而且 static 的 Hashtable 永远都会贮存在内存中,这样必将导致 Hashtable 越来越大,最终内存泄漏。
清单 14. 内存泄漏的 Vector
public class VectorLeakDemo
{
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
更多精彩
赞助商链接