Java中的内存泄漏:多种方法中的数据库连接

时间:2014-05-07 18:13:41

标签: java memory-leaks

我已经构建了一个爬虫程序,目前正在以600MB /天的速度遇到内存泄漏。我认为原因是数据库连接。 目前,我正在创建单个数据库连接作为静态方法,如下所示:

static
{       
    try
    {
        String hostname = PropertyReader.getProperty("hostname");
        String port = PropertyReader.getProperty("port");
        String dbname = PropertyReader.getProperty("dbname");
        String username = PropertyReader.getProperty("username");
        String password = PropertyReader.getProperty("password");

        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://"+hostname+":"+port+"/"+dbname+"";
        conn = DriverManager.getConnection(url, username, password);
        System.out.println("conn built");
    }
    catch (SQLException e)
    {
        e.printStackTrace();
    } catch (ClassNotFoundException e)
    {
        e.printStackTrace();
    }
}

我在多种方法中使用此变量如下:

public static void getSeed()

public static void processPage(String URL)

用于检索数据并将数据插入数据库。

避免内存泄漏的最佳替代方法是什么?

2 个答案:

答案 0 :(得分:3)

内存泄漏的最大原因是忘记关闭ResultSet和PreparedStatements。无法判断您是否在代码中的其他位置执行此操作,但如果您这样做,那就是我要开始的地方。

答案 1 :(得分:2)

以下是我的想法:

  1. 我不会猜到内存泄漏。唯一可靠的解决方法是分析您的代码。做一名科学家 - 获取数据。使用安装了所有插件的Visual VM。这是一个很棒的工具而且是免费的。
  2. 我不会这样做数据库连接。连接不是线程安全的。单个连接也不会感觉到可扩展性。最好有一个连接池,您可以在最窄的范围内签入和签出。
  3. 您不显示任何数据库代码,但需要在创建它们的方法范围内的finally块中关闭所有Statement,Connection和ResultSet实例。每个应该在单独的try / catch块中关闭。这将显示为爬虫中内存泄漏之外的问题:您的数据库服务器最终将耗尽游标。如果您无法正常清理,则客户端和数据库服务器都会出现问题。
  4. 不同的线程不应共享单个连接。这将导致悲伤。设置连接池,然后配置文件。你可能会对泄漏出现的地方感到惊讶。