为什么此功能会导致内存泄漏?

丘巴库尔
public void filterLogins() throws IOException, SQLException{
    for(int i = 0; i<200; ++i){
        BufferedReader bufferedReader = new BufferedReader(new FileReader(folder + String.format("\\data\\part-%05d", i)));
        long prev_id = 0;
        boolean contains = false;
        while(bufferedReader.ready()){ //very big file
            String line = bufferedReader.readLine();
            Login login = new Login(line);
            if ( login.userId == prev_id && !contains )
                continue;
            if ( samples.contains(login.userId) ){
                mysql.execute("INSERT INTO ..."); // i think it doesn't matter in this case
                contains = true;
            }else{
                contains = false;
            }
            prev_id = login.userId;
        }
        bufferedReader.close();
        System.out.println((double)i/2.0);
    }
}

此功能可以长时间工作,因为数据是更大的文件。2小时前,这是OutOfMemory异常的美眉

mysql是的实例

public class MySQLHandler {
private Connection connection = null;
MySQLHandler() throws ClassNotFoundException, SQLException{
    try{
        Class.forName("com.mysql.jdbc.Driver");
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/database", "root", "");
    }catch (ClassNotFoundException e){
        System.out.println("Failed jdbc driver load.");
        throw e;
    }
}


public void close() throws SQLException{
       if ( connection != null)
           connection.close();
   }
   public boolean execute(String sql) throws SQLException{
       Statement statement = connection.createStatement();
       return statement.execute(sql);
   }
}

登录它只是带有数据的类。(id,名称,值等)。

似乎您是在每次创建Statement,而不是在循环中关闭该语句,这会导致内存泄漏。执行完成后,关闭语句。

 public boolean execute(String sql) throws SQLException{
       Statement statement = connection.createStatement();
       return statement.execute(sql);
   }

喜欢

 public boolean execute(String sql) throws SQLException{
     Statement statement = null;
    try {
        statement = connection.createStatement();
        return statement.execute(sql);
    }finaly{
         if (statement != null) statement.close();
     }

UPDATE

作为@Holger在评论中提到,如果您使用的是JDK 7或更高,那么你可以使用的try-与资源喜欢以下

public boolean execute(String sql) throws SQLException{
       try(Statement s=connection.createStatement()) {
          return s.execute(sql);
       }
 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么此JavaScript会导致内存泄漏?

为什么此Observable.Generate过载会导致内存泄漏?[使用Timespan <15ms]

为什么此画布绘图导致内存泄漏?

为什么此接口委托导致内存泄漏?

为什么调用堆栈数组会导致内存泄漏?

为什么使用“ new”会导致内存泄漏?

为什么重复调用FileOpenDialog会导致内存泄漏?

为什么这个函数会导致内存泄漏?

为什么基本的Swift代码会导致内存泄漏?

为什么嵌套的initializer_list会导致内存泄漏

如何避免此功能导致内存泄漏?

此功能会泄漏内存吗?

为什么此代码会导致内存耗尽?

为什么此流功能会导致错误?

为什么此功能会导致段错误?

为什么指向同一个内存的多个共享指针会导致内存泄漏?

为什么Rxjava可能导致内存泄漏

Delphi:为什么这会导致内存泄漏?

为什么 Devel::LeakTrace 会泄漏内存?

Angular.js-此指令会导致内存泄漏吗?

是否有为什么会AccessibilityManager.sInstance导致内存泄漏的一个原因?

为什么Node.js中的全局数组会导致内存泄漏?

为什么将列表附加到其自身然后删除会导致内存泄漏

如果重置了回调,为什么静态Drawable会导致Android泄漏内存?

为什么这个二进制输出代码会导致内存泄漏

为什么即使删除后std :: string也会导致类中的内存泄漏

为什么Objective-C中的“ try catch”会导致内存泄漏?

为什么类型化数组会导致JavaScript中的内存泄漏

为什么用CGImageSource加载gif会导致内存泄漏?