2014-01-24 25 views
0

我有一個Web應用程序,它記錄來自各個門戶的數據。 這是一個使用mongo db作爲數據庫服務器的java應用程序。 我的應用程序速度不夠快,但是我面臨的問題是Tomcat在每個應用程序服務器上都吃掉了太多Ram內存。我必須每隔兩個小時重新啓動一次tomcat以釋放此內存,否則它將無法響應。我運行netstat -n |每臺服務器上的wc -l和每臺服務器上的平均輸出量爲1000。 我在我的servlet和mongo dao中引入了System.gc以強制GC釋放內存,但它將CPU使用率提高到了100%。 請問你可以建議任何方式如何解決這個內存問題。JVM在服務器中使用的內存太多

+0

在特定時間創建轉儲並分析它。 – Kick

+0

我以30分鐘的時間間隔創建了堆轉儲,但始終沒有增加順序的某些對象的確定模式。我發現有很多創建的字符串對象。 – viren

+0

您是否看到內存使用量接近飽和且GC啓動的證據?與此同時,「netstat -n | wc -l」獲得1000個聽起來很多。在我的機器上,我回到了100左右。難道連接沒有正確關閉? – neurite

回答

0

我使用以下方法在Java中查找內存泄漏。我已經使用jProfiler獲得了巨大的成功,但我相信任何具有圖形功能的專業工具(差異圖形更易於分析)都可以工作。

啓動應用程序並等到它變爲「穩定」狀態,此時所有初始化完成並且應用程序處於空閒狀態。 運行懷疑會產生內存泄漏的操作幾次,以允許任何緩存,DB相關的初始化發生。 運行GC並記錄內存快照。 再次運行該操作。取決於操作的複雜性和處理的數據的大小,操作可能需要運行多次或多次。 運行GC並記錄內存快照。 爲2張快照運行差異並分析它。 基本上,分析應該從最大的正面差異開始,比如說對象類型,並找出導致這些額外對象粘在內存中的原因。

對於在多個線程中處理請求的Web應用程序分析變得更加複雜,但仍然適用一般方法。

我做了很多專門用於減少應用程序內存佔用的項目,這種通用方法與一些應用程序特定的調整和技巧一直運行良好。