由于代码中HashMap
,我面临内存泄漏。当我第一次登录应用程序时,这个HashMap
会填充,我使用这个Map
来缓存一些数据。
我在我的应用程序中使用了这个缓存数据的几个地方。
在应用程序中没有运行任何内容后,它的大小会持续增长。 只有当自动调用垃圾收集器或我调用它时,大小才会减小。
但之后又开始增加。这肯定是内存泄漏,但我该如何避免呢?
我的探查器还显示ResultSet.getString()
和Statement.execute()
作为热点内存分配。这些方法用于填充此缓存。
由于这些方法,内存是否泄漏?我在finally块中关闭了DB Connection。
为什么还在向我展示这些方法?
答案 0 :(得分:3)
正如上面的评论所解释的那样,这听起来不像是内存泄漏。
在Java应用程序中,JVM将创建对象并耗尽内存。随着时间的推移,一些对象将超出范围(有资格进行垃圾收集),但在下一次收集发生之前,它们仍然会在堆中“耗尽内存”。这不是问题,它是java的工作方式。当JVM决定它需要释放内存时,它将运行一个集合,并且使用的内存应该会丢弃。
你应该关心你所看到的吗?我可以想到你应该有两个原因,一个你为什么不应该这样做。如果你的垃圾收集释放了足够的内存以便应用程序继续运行,那么收集不会影响性能,而你是一个忙碌的人,有其他事情可做,那么我认为没有理由你应该关心。
但是,如果您担心自己无法理解应用程序的详细工作方式,或者您有“太多内存”存在问题的原因(您将来希望运行具有更多数据的应用程序,或者希望在将来分配较少的堆时运行它,然后你可能想要调查。
如果在应用程序什么都不做的时候内存正在用完,那么我会专注于那个。当它什么都不做的时候它真的在做什么?我打赌它正在做'某事'