执行Timer任务时Derby数据库中的内存泄漏

时间:2015-02-27 12:02:43

标签: java memory-leaks 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);
        }
    }
}

以下是快照:

enter image description here 记忆(堆)

enter image description here 记忆(GC) - 幸存的世代

这是一些Derby数据库错误吗?
JDK8_u31,Derby版本/包上运行:db-derby-10.11.1.1-lib

编辑1: 当切换到HSQLDB数据库时 - 在打开和关闭数千个连接时不再发生内存泄漏:

enter image description here 哇! :)

enter image description here

1 个答案:

答案 0 :(得分:1)

我认为这可能是由于Statement和/或Connection没有实施AutoCloseable。但是,根据JLS,这将是一个编译错误......并且javadocs说这些接口确实实现了它。

看起来它是一个Derby bug,它可能与这个有关:

使用内存分析器尝试查看哪些类的对象泄漏。这应该会给你更多线索。