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
,Derby版本/包上运行:db-derby-10.11.1.1-lib
。
编辑1:
当切换到HSQLDB
数据库时 - 在打开和关闭数千个连接时不再发生内存泄漏:
哇! :)
答案 0 :(得分:1)
我认为这可能是由于Statement
和/或Connection
没有实施AutoCloseable
。但是,根据JLS,这将是一个编译错误......并且javadocs说这些接口确实实现了它。
看起来它是一个Derby bug,它可能与这个有关:
使用内存分析器尝试查看哪些类的对象泄漏。这应该会给你更多线索。