去年,當我將第一個Grails應用程序部署到生產環境時,我遇到了一些Grails問題和高內存使用問題。我的應用程序會執行大量的數據庫選擇,插入,刪除和更新,並且每分鐘執行大約10000個活動會話/用戶。
對於開發,我用1024M HEAP做得很好。然而,當部署到生產內存使用增加很多。我在幾分鐘內得到了OutOfMemory異常。我做的第一件事是將HEAP大小增加到2048M,並且應用程序現在會運行一週,然後再次拋出OutOfMemoryError異常。我還使用了-XX:+ UseConcMarkSweepGC垃圾收集器。
我猜想有一些內存泄漏,但我無法弄清楚。所以我安裝了 Java Melody plugin來監視內存使用情況。我還用JVisualVM找出可以吃掉所有內存的對象類型。
經過幾天的監測,結果發現沒有內存泄漏,但是有一段時間的內存使用率經歷了高峯。目前平均內存使用量約爲1200MB。我再次將HEAP增加到3072M,現在尖峯永遠不會使用比可用的更多的HEAP,但尖峯可能使用高達2800MB的內存。
我的應用程序現在穩定,並且可以運行數月,沒有任何問題。然而,內存使用率仍然很高,我已經在幾個月裏做了一些工作來改善這一點。有兩件事真的有助於減少內存使用量。
第一個很容易,禁用休眠二級緩存。如果您的數據頻繁更改,這被稱爲有用的。對我來說,這也稍微改善了整體表現。這可以在grails-app/conf目錄來完成/ DataSource.conf
cache.use_second_level_cache=false
cache.use_query_cache=false
我做的第二件事是調整Searchable plugin。我開始返回一千個點擊,現在最高點擊數是一百個。
這兩個調整減少了75%的峯值。我還做了很多與查詢有關的小調整,特別是減少查詢返回的數據量。 例如,我有一個名爲Issue的域名類有20多個屬性,但是在渲染到視圖時我只需要一些屬性。它可以將結果轉換到地圖是這樣的:
Issue.executeQuery(
"select new map(i.id as id, i.title as title i.date as date) FROM Issue i"
)
調整這樣可以提高查詢時,內存使用情況和整體性能。希望能幫助到你。
您沒有-Xms意外設置爲較高值?如果沒有其他事情一定要去。雖然Grails的內存要求相當高,但對於非常簡單的應用程序,它的範圍更多在128mb-256mb之間。 – Ruben 2011-05-25 06:17:50
只是想編造一下,我有同樣的問題:當我啓動我的Grails應用程序(少於十幾個控制器和域類,腳手架),但然後做_absolutely nothing_但保持運行,jvisualvm顯示_continuously_攀登堆使用率。注意:我甚至沒有擊中應用程序(沒有請求),只是啓動。 – 2011-11-09 02:59:03