以下代码是否可能泄漏JDK 7中的内存?
//size of input obj is around 15K
public save(List<DBObj> objs){
//added in new EDIT
if(objs ==null || objs.size == 0)
return;
if(objs.size()> 999) {
save(objs.sublist(0,999));
save(objs.sublist(999,objs.size())
}
//EDIT finish
StringBuffer sb = new StringBuffer();
sb.append(SOMEINSERTQUERYPREFIX)
for(DBObj obj : objs){
//add some prefix
sb.append(checkNULLforDBInsert(obj.getF1())).append(" , ");
sb.append(checkNULLforDBInsert(obj.getField2())).append(" , ");
sb.append(checkNULLforDBInsert(obj.getField3())).append(" , ");
//app sufix
}
}
private String checkNULLforDBInsert(String str)
{
if (str == null || str.toLowerCase().equals("null"))
{
return "null";
} else {
//suspecting this for leak ,Should a StringBuilder be used here too?
return "'" + str + "'";
}
}
为什么我认为它有泄漏
函数checkNULLforDBInsert将引号附加到每个输入str。现在将调用此方法
对象中的15K * 12个字段数。我认为这可能会造成泄漏,因为必须使用StringBuffer。
Plz评论
答案 0 :(得分:1)
不,这不是内存泄漏,因为所有分配的对象只能通过本地变量访问,一旦方法完成,这将超出范围,这反过来使对象无法访问并且有资格进行垃圾回收。
代码是可怕的另一个原因:将用户提供的数据连接到SQL语句允许用户向数据库发送任意命令,这些命令(取决于数据库用户的权限和数据库的类型)可以升级到完成远程代码执行并由攻击者接管数据库服务器。