首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBC4Connection中的内存泄漏

问JDBC4Connection中的内存泄漏
EN

Stack Overflow用户
提问于 2010-12-03 02:27:58
回答 3查看 3.9K关注 0票数 5

我正在尝试捕获我们的一个Java守护进程中的内存泄漏,在转储内存并通过内存分析器工具对其进行分析后,注意到大部分泄漏是由JDBC4Connection引起的:

代码语言:javascript
复制
10 instances of "com.mysql.jdbc.JDBC4Connection", loaded by "sun.misc.Launcher$AppClassLoader @ 0x2aaab620ed00" occupy 858,283,752 (81.55%) bytes. Biggest instances:

* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64ad820 - 87,110,160 (8.28%) bytes.
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64af520 - 86,730,408 (8.24%) bytes.
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64ad0e0 - 86,584,048 (8.23%) bytes.
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64aede0 - 86,488,800 (8.22%) bytes.
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab61f5320 - 85,752,872 (8.15%) bytes.
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64ae6a0 - 85,603,280 (8.13%) bytes.
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64adf60 - 85,270,440 (8.10%) bytes.
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab61f4be0 - 85,248,592 (8.10%) bytes.
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab64afc60 - 85,120,704 (8.09%) bytes.
* com.mysql.jdbc.JDBC4Connection @ 0x2aaab61f5a60 - 84,374,448 (8.02%) bytes.

Keywords
com.mysql.jdbc.JDBC4Connection
sun.misc.Launcher$AppClassLoader @ 0x2aaab620ed00

我很确定我们关闭了所有的MySQL资源,但是找不到导致这个问题的原因。

有什么好方法可以抓住它吗?你以前有过这样的经历吗,能告诉我应该找什么吗?

附注:使用MAT更深入地查看,我看到以下信息:

com.mysql.jdbc.JDBC4Connection @ 0x2aaab64ad820 | 1,856 | 87,110,160 | 8.28% |- java.util.HashMap @ 0x2aaab62115a8 | 64 | 87,021,632 | 8.27% | '- java.util.HashMap$Entry[16384] @ 0x2aaae182e970| 131,096 | 87,021,568 | 8.27%

似乎每个JDBC都拥有大量的Hashmap条目(>6000个对象),并且根本没有释放它们。

提前感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-03 03:34:44

Duffymo几乎肯定是对的。在过去,当我们遇到内存泄漏时,实际上总是MySQL JDBC驱动程序。只是忘了在某个地方关闭一个小的ResultSet、连接或语句。每次我们使用这些代码库来发现问题并确保它们被关闭时,我都会审计整个代码库。

至于HashMap,我也见过。我没有看过源代码,但我的印象是MySQL驱动程序在内部将行(至少行值)存储在HashMaps中。

可悲的是,泄露ResultSets非常容易。由于这个原因,JDK 7或8中出现的那些自己负责这一点的可关闭资源的想法真的很吸引我。

你可以在某个地方插入一个填充类(比如Connection)来记录每个打开/关闭的资源,看看你是否可以在不直接读取所有源代码的情况下捕捉到泄漏的位置。

票数 6
EN

Stack Overflow用户

发布于 2010-12-03 02:31:44

我很确定我们关闭了所有的MySQL资源

如果不是100%确定,请显示您是如何关闭连接的。

您是否在使用连接池?它会碰巧有一个10的池大小吗?

票数 4
EN

Stack Overflow用户

发布于 2019-09-11 13:16:56

听起来像是您有一个具有10个连接的连接池,并且该池启用了语句缓存,但缓存大小并未限制为正常大小。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4338445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档