1

HashMap由于我的代码,我面临内存泄漏。当我第一次登录应用程序时,它会HashMap填充并使用它Map来缓存一些数据。

我在我的应用程序中的几个地方使用了这个缓存的数据。

当应用程序中没有运行任何内容时,它的大小在登录后不断增长。只有在自动调用垃圾收集器或我调用它的情况下,大小才会减小。

但在那之后它再次开始增加。这肯定是内存泄漏,但我该如何避免呢?

我的分析器还显示ResultSet.getString()Statement.execute()作为热点内存分配。这些方法用于填充此缓存。

是否因为这些方法而导致内存泄漏?我在 finally 块中关闭了数据库连接。

为什么它仍然向我展示这些方法?

4

1 回答 1

3

正如上面的评论所解释的,这听起来不像是内存泄漏。

在 Java 应用程序中,JVM 将创建对象并耗尽内存。随着时间的推移,一些对象将超出范围(变得有资格进行垃圾回收),但直到下一次回收发生,它们仍将在堆中,“耗尽内存”。这不是问题,这就是 java 的工作方式。当 JVM 决定它需要释放内存时,它将运行一个集合并且使用的内存应该下降。

你应该关心你所看到的吗?我可以想到两个你应该的原因和一个你为什么不应该的原因。如果您的垃圾收集为应用程序继续运行释放了足够的内存,这些收集不会影响性能并且您是一个忙于其他事情的人,那么我认为您没有理由关心。

但是,如果您担心您不了解应用程序的详细工作原理,或者您有理由说明“这么多内存”是一个问题(您将来希望使用更多数据运行应用程序,或者希望以在将来分配更少的堆来运行它),那么您可能需要进行调查。

如果当应用程序什么都不做时内存正在被用完,那么我会专注于此。当它“无所事事”时,它到底在做什么?我敢打赌它在做“某事”

于 2012-02-27T10:28:56.710 回答