执行计时器任务时 Derby 数据库中的内存泄漏
Memory leak in Derby database while executing Timer task
我的情况很奇怪。执行此代码时,NetBeansIDE 探查器显示内存泄漏(经过一段时间后,应用程序因内存不足而退出):
public class SomeClass extends TimerTask {
private static final Timer timer = new Timer();
public SomeClass() {
//Delay 0, repeat every 20ms
timer.scheduleAtFixedRate(SomeClass.this, 0, 20);
}
@Override
public void run() {
try (Connection connDB =
DriverManager.getConnection(
"jdbc:derby:someDataBase;create=true");
Statement st = connDB.createStatement()) {
//Some code in normal situation. But the problem
//exists even without additional code..
} catch (SQLException ex) {
Logger.getLogger(SomeClass.class.getName()).log(
Level.SEVERE, null, ex);
}
}
}
以下是快照:
内存(堆)
内存 (GC) - 存活世代
这是一些 Derby 数据库错误吗?
运行 JDK8_u31
,德比 version/package:db-derby-10.11.1.1-lib
。
编辑 1:
切换到 HSQLDB
数据库时 - 在打开和关闭数千个连接时不再发生内存泄漏:
哇! :)
我认为这可能是由于 Statement
and/or Connection
没有实施 AutoCloseable
。然而,根据 JLS,那将是一个编译错误......并且 javadocs 说那些接口确实实现了它。
看起来这是一个 Derby 错误,可能与此有关:
使用内存分析器尝试查看哪些 类 对象正在泄漏。那应该会给你更多线索。
我的情况很奇怪。执行此代码时,NetBeansIDE 探查器显示内存泄漏(经过一段时间后,应用程序因内存不足而退出):
public class SomeClass extends TimerTask {
private static final Timer timer = new Timer();
public SomeClass() {
//Delay 0, repeat every 20ms
timer.scheduleAtFixedRate(SomeClass.this, 0, 20);
}
@Override
public void run() {
try (Connection connDB =
DriverManager.getConnection(
"jdbc:derby:someDataBase;create=true");
Statement st = connDB.createStatement()) {
//Some code in normal situation. But the problem
//exists even without additional code..
} catch (SQLException ex) {
Logger.getLogger(SomeClass.class.getName()).log(
Level.SEVERE, null, ex);
}
}
}
以下是快照:
这是一些 Derby 数据库错误吗?
运行 JDK8_u31
,德比 version/package:db-derby-10.11.1.1-lib
。
编辑 1:
切换到 HSQLDB
数据库时 - 在打开和关闭数千个连接时不再发生内存泄漏:
我认为这可能是由于 Statement
and/or Connection
没有实施 AutoCloseable
。然而,根据 JLS,那将是一个编译错误......并且 javadocs 说那些接口确实实现了它。
看起来这是一个 Derby 错误,可能与此有关:
使用内存分析器尝试查看哪些 类 对象正在泄漏。那应该会给你更多线索。