我有一个webcrawler thar使用连接池连接到数据库并插入页面。
我看到程序执行时内存使用量正在增加。我想我忘了关闭一些PreparedStatement或连接的另一个对象。
我调用connection.close方法,但它只返回连接到数据库。
有一种方法可以查看连接中是否有已打开的对象?
答案 0 :(得分:1)
您似乎建议您的应用程序存在内存泄漏。要开始调试,可以使用jmap
,JDK附带的实用程序(通常位于java,javac,javadoc等旁边的bin目录中)。此命令将生成位于JVM中的所有对象的内存映射。您可以在应用程序运行时随着时间运行它并比较对象计数以查看是否存在任何类型的对象似乎具有不断增加的总计数,但没有减少(由于垃圾收集)。
jmap -heap -histo <PROCESS_ID_OF_YOUR JVM>
如果您确实没有正确关闭语句对象,您很快就会看到它们冒泡到堆栈顶部。
所有“可关闭的”对象应该在finally块中关闭,以避免在结束之前抛出异常时,在JVM中留下开放的连接,语句等等。
注意:在Windows上,这些可执行文件具有.exe后缀。