【问题标题】:Memory leak in Derby database while executing Timer task执行 Timer 任务时 Derby 数据库中的内存泄漏
【发布时间】:2015-02-27 12:02:43
【问题描述】:

我的情况很奇怪。执行此代码时,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 上运行,Derby 版本/包:db-derby-10.11.1.1-lib

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

哇! :)

【问题讨论】:

  • 您正在关闭连接和语句,但您是否也在使用结果集并关闭它们?
  • 不,代码和你看到的完全一样,不涉及ResultSet..
  • “不,代码和你看到的完全一样” - 那么……“//some code”是什么意思?你真的只是创建和丢弃连接和语句对象吗??
  • 无代码。是的,只有ConnectionStatement 打开和关闭。我很惊讶.. :)

标签: java memory-leaks derby


【解决方案1】:

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

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

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

【讨论】:

  • 看来这可能是真的.. 错误于 2011 年 9 月 16 日打开,但仍未解决...
  • 请注意,错误报告提供了一种可能的解决方法。不要关闭Statement。另一种是使用连接池而不是重复打开/关闭连接。如果不出意外,效率会更高。
  • 是的,我尝试打开和关闭StatementResultSet很多次,似乎Memory (GC)不再上升了。但是保持Connection 始终打开不是很方便和有效,请记住循环可能需要很长时间。另一个问题:)
  • 我说的是连接池,而不是“保持连接始终打开”。此外,长时间保持连接打开是非常有效的。每次打开连接时,都会产生设置新 Socket、建立网络连接、进行 SSL 协商等的开销。
  • Derby - 在垃圾桶里。尝试使用H2 - 同样的问题。 HSQLDB - 这里的赢家 :) 打开和关闭连接时绝对没有问题,也没有泄漏。并且更少的 RAM 消耗。我使用2ms 循环进行了测试 - CPU 负载为 50 -60 %。稍后将看到HSQLDB 将如何执行。至少现在我很高兴 :) 我很惊讶为什么 Derby 开发人员对此无所作为......这是非常严重的缺点。
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 2013-11-06
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多