2

我有内存泄漏的问题。我的代码示意图:

CallableStatement c = Baza.conn.prepareCall("select * from something");           
ResultSet rs = c.executeQuery();//takes about 100sec

while(rs.next())
{
//do stuff, only calculations, I don't create any object
}   

rs.close();
c.close();

executeQuery执行 RAM 时,使用率高达 300MB,并且再也不会下降。当程序再次在同一个地方(但选择略有不同)时,Ram 使用率有时会再次上升,有时不会。我应该做的不仅仅是接近ResultSet吗?非常感谢您的帮助,因为现在我必须每隔几个小时重新启动该程序。

我正在使用 JDBC4 和 posgresql

4

4 回答 4

1

您可以使用游标并设置提取大小以减少查询的内存使用量。

Baza.conn.setAutoCommit(false); // Turn off autocommit on the connection to enable cursors in JDBC
CallableStatement c = Baza.conn.prepareCall("select * from something");           
c.setFetchSize(1000); // The fetch size determines the number of records returned in each "Batch"
ResultSet rs = c.executeQuery();// This may appear to run faster depending on the query

// Nothing changes here.  The JDBC driver handles the cursor for you.
while(rs.next())
{
//do stuff, only calculations, I don't create any object
}   

rs.close(); // This will close the cursor
c.close(); // I would recommend re-enabling autocommit if you weren't closing the connection here
于 2013-02-15T18:32:48.420 回答
0

您可以使用 :

Baza.conn.setAutoCommit(false);

在 ResultSet 之前,并使用:

rs.getMoreResults(java.sql.Statement.CLOSE_CURRENT_RESULT);
Baza.conn.commit();

在 ResultSet 之后和之前

rs.close();
c.close();
于 2013-04-18T14:14:18.420 回答
0

如果查询需要那么长时间,则可能是连接速度非常慢,或者您返回了大量数据。将所有数据保存在 RAM 中并不是最好的解决方案。正如 Jigar Joshi 的评论已经指出的那样:您可能想研究分页。此外,关闭连接也是一个好习惯。关于垃圾收集,请考虑 Java7,它有一个新的垃圾收集器(例如,请参阅Java 7 (JDK 7) 垃圾收集和 G1 上的文档),可能更适合您的需求

于 2013-02-15T18:20:09.717 回答
0

确保也关闭“conn”。

JVM 在内部管理内存。您不必期望您的操作系统报告的 RAM 利用率会立即释放。当 JVM 执行垃圾回收时,它最终应该被释放。配置 JMX 监听器,使用 JConsole 监控 JVM 内存,不要信任操作系统。

于 2013-02-15T18:13:59.100 回答