JDK 7中使用String的内存泄漏

时间:2014-12-20 17:48:49

标签: java string memory-leaks jvm stringbuilder

以下代码是否可能泄漏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评论

1 个答案:

答案 0 :(得分:1)

不,这不是内存泄漏,因为所有分配的对象只能通过本地变量访问,一旦方法完成,这将超出范围,这反过来使对象无法访问并且有资格进行垃圾回收。

代码是可怕的另一个原因:将用户提供的数据连接到SQL语句允许用户向数据库发送任意命令,这些命令(取决于数据库用户的权限和数据库的类型)可以升级到完成远程代码执行并由攻击者接管数据库服务器。

更多信息:SQL injection Wikipedia page