java - JVM堆不断增加。为什么?

标签 java jdbc memory-leaks resources try-with-resources

executor = Executors.newScheduledThreadPool(1);
Runnable helloRunnable = new Runnable() {
    public void run() {
        controller2.GetAIntFromDatabase(columblName);
    }
};
executor.scheduleAtFixedRate(helloRunnable, 0, 10, TimeUnit.MILLISECONDS);

这部分程序会产生堆内存增加错误。

 controller2.GetAIntFromDatabase(columblName); 

通过这个函数,我从数据库中读取了一个 int 值。

    @Override
    public int GetAIntFromDatabase(String columblName) {
        int stare = 0;
        try{
            String query = "SELECT * FROM stari ORDER BY id DESC LIMIT 1"; 
            PreparedStatement preparedStatement = this.connnection.prepareStatement(query);          
            ResultSet resultSet = preparedStatement.executeQuery();
            if (resultSet.next()){
               stare = resultSet.getInt(columblName);
             preparedStatement.close();            
                resultSet.close();
               return stare;
            }
            preparedStatement.close();            
            resultSet.close();
        }catch (SQLException ex) {
            System.out.println("GetUtilajStare Error: "  + ex);
            return 0;
        }

        return 0;
    }

这是运行10分钟后的Java堆内存使用情况:

used Java Heap memory for 10 min

为什么我的堆内存不断增加?

最佳答案

如果在打开preparedStatementresultSet后抛出异常,它们将永远不会被关闭。因此,您应该使用始终执行的finally block 。

public int GetAIntFromDatabase(String columblName) {
    int stare = 0;
    PreparedStatement preparedStatement = null;
    ResultSet resultSet = null;
    try {
        String query = "SELECT * FROM stari ORDER BY id DESC LIMIT 1";
        preparedStatement = this.connnection.prepareStatement(query);
        resultSet = preparedStatement.executeQuery();
        if (resultSet.next()) {
            stare = resultSet.getInt(columblName);
            return stare;
        }
    } catch (SQLException ex) {
        System.out.println("GetUtilajStare Error: " + ex);
        return 0;
    } finally {
        if (preparedStatement != null)
            preparedStatement.close();
        if (resultSet != null) 
            resultSet.close();
    }
    return 0;
}

关于java - JVM堆不断增加。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48928896/

相关文章:

java - 使用 JDBC 读取 csv 文件时如何转义 '"'?

java - 在应用程序启动时执行多个脚本

具有单例属性的 iPhone 内存管理

java - 在 java restful api 中查找内存泄漏

java - Android问题用opengl es绘制位图

java - 设计可中断的 Runnable

java - Java 独立应用程序中静态连接对象的缺点

ios - Xcode:在 Instruments 中未发现僵尸

JAVA需要一个条件判断整个二维数组是否满

java - 当我有一个应该停止负数的输入验证时,最小值方法将返回负数