在接下来的几行中,我将讨论该应用程序的一些背景知识:

XYZ 是一个数据屏蔽工作台Eclipse RCP应用程序:您为其提供源表列和目标表列,它将应用转换(加密/混洗/等)并将行数据从源表复制到目标表。现在,当我一次屏蔽n个表时,此应用程序将启动n个线程。

这是问题:

我在上述应用的首次推出时遇到了生产问题。不幸的是,我没有任何日志可以进入根目录。但是,我尝试在测试区域中运行该应用程序并进行压力测试。

当我收集.hprof文件并通过分析器(yourKit)运行时,我注意到oracle.jdbc.driver.T4CPreparedStatement的对象正在保留堆。该分析还告诉我,我的一个类正在持有对该preparestatement对象的引用,因此,n个线程具有n个此类对象。 T4CPreparedStatement似乎具有字符数组:lastBoundChars和bindChars的大小均为char [300000]。

因此,我做了一些研究(google!),获得了ojdbc6.jar并尝试反编译T4CPreparedStatement。我看到T4CPreparedStatement扩展了OraclePreparedStatement,它动态管理lastBoundChars和bindChars的数组大小。

因此,我的问题是:

  • 您是否遇到过类似的问题
    这?
  • 你知道
    lastBoundChars/bindChars?
  • 我是新手,所以您
    认为我做的不正确吗? (一世
    还通过MAT运行了hprofs-
    这是主要确定的
    问题-所以,我真的不认为我
    可能是错的吗?)

  • 我在这里的网上找到了类似的东西:
    http://forums.oracle.com/forums/thread.jspa?messageID=2860681

    感谢您的建议。

    最佳答案

    虽然可能,但您似乎不太可能在11g中发现大量内存泄漏。我将首先从泄漏的游标中获取实际的SQL,然后在代码中查找该SQL的创建位置。我过去发现的游标泄漏的一个很常见的原因是这样的代码:

    try {
    PreparedStatment stmt = null;
    stmt = con.prepareStatement("SOME AWESOME SQL");
    //lots of lines of code that masks the problem
    stmt = con.prepareStatment("DIFFERENT SQL"); //You just leaked "SOME AWESOME SQL"!!!
    //lots more code
    } finally {
    stmt.close() //looks like everything is ok, but only the second one actually got closed
    }
    

    10-06 14:11