在接下来的几行中,我将讨论该应用程序的一些背景知识:
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
}