2012-02-27 79 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