2012-02-27 150 views
1

由于我的代码中有HashMap,所以我正面临内存泄漏问题。当我第一次登录到应用程序时,这个HashMap填充,我用这个Map来缓存一些数据。由于HashMap造成的内存泄漏

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

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

但之后它又开始增加。这是肯定的内存泄漏,但我怎么能避免它?

我的配置文件还显示ResultSet.getString()Statement.execute()作为热点内存分配。这些方法用来填充这个缓存。

由于这些方法,内存泄漏吗?我终于关闭了数据库连接。

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

+7

垃圾回收器收集有问题的内存时,它怎么可能是内存泄漏? – jalf 2012-02-27 09:30:25

+0

我不知道,但我注意到,GC称为内存使用减少后,但一段时间后,它再次迅速增加,当没有在我的应用程序运行...是不是内存泄漏? – 2012-02-27 09:33:39

+7

您不需要使用多个问号来表示问题。 ''''并不能使它成为比'?'更多的问题。而且pelase不会使问题的一半**大胆**。同样,'code markup'只能用于实际的* code *。不只是你想强调的作品。遵循这些规则,让其他人更容易阅读您的问题。谢谢 – jalf 2012-02-27 09:34:19

回答

3

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

在Java应用程序,JVM将创建对象和使用内存。随着时间的推移,一些对象将超出范围(有资格进行垃圾回收),但在下一次收集发生之前,它们仍然在堆中,“占用内存”。这不是问题,它是java如何工作的。当JVM决定需要释放内存时,它将运行一个集合,并使用的内存应该丢失。

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

但是,如果您担心自己不明白应用程序的详细工作方式,或者您有理由说“如此之多的内存”是一个问题(您会希望在将来运行更多数据的应用程序或者希望将来使用较少的堆来运行它),那么您可能需要进行调查。

如果内存用完应用程序时无所事事,那么我将专注于这一点。什么事情在做'没有'时真的在做什么?我敢打赌,它正在做'某事'

+0

通过无所作为我的意思是我已经成功登录到系统,缓存成功填充,但是当我等待某个时间并再次看到内存仍在增长时。 – 2012-02-27 12:17:58