2016-01-26 23 views
2

我們的團隊一直在使用Grails(版本2.3.5),並且在一年之內,管理我們的服務器的交付團隊幾乎沒有任何與寫入的應用程序相關的經驗Grails的。使用Grails webapps「OutOfMemoryError:PermGen space」

我們有幾個Tomcat 7實例,都在測試和生產環境中,都有一定數量的webapps。儘管只包含用Java開發的webapps(w/Spring,Hibernate)的一些實例有時可以達到20個上下文而沒有大問題,但似乎任何超過6個Grails應用程序(與Java對應程序非常相似的應用程序)都會定期啓動造成可怕的PermGen空間問題。

PermGen分配的當前是536Mb,交付團隊顯然建議爲新應用程序使用單獨的實例或增加分配的內存;同時他們敦促我們驗證這些應用程序如何讓內存飽和。

我們的印象是,這對Grails應用程序來說是正常的,但沒有任何高級Grails開發人員,我們無法通過經驗或更好的知識來確認它。 對於8個「常規」Grails webapps,536Mb在PermGen中的分配空間太少了嗎?

更新: 爲了說明我的意思是「常規」,這些對於不同的服務來說都是前端+後端的幾對,前端只有一個請求列表,一個嚮導從零到完成的請求,驗證數據,堅持它,調用Web服務以獲得協議號碼,並在幾個情況下調用外部支付網關。 後端用於管理請求並執行類似的操作。

每個應用程序可能都有大約20個具有相應控制器,服務和視圖的實體,除此之外,我們還有幾個類來處理Spring Security和外部基礎架構的安全性。

+1

「Regular」Grails應用程序的聲音比較主觀。你在Java/Spring應用程序中爲持久層使用了什麼?你正在使用哪個版本的Grails?我預計536Mb對你的設置很低。你有沒有加載測試Grails應用程序失敗?一個人在什麼時候肚子餓了? – vector

+2

也許你正在加載gsp文件,這些文件對於sitemesh來說太大而無法正確解析,從而導致內存不足錯誤。 –

+0

將編輯問題添加一些細節。然而,我們沒有加載測試應用程序。 –

回答

2

就是這樣。你基本上有兩種選擇。

  1. 遷移上的Java 8(參照http://www.infoq.com/articles/Java-PERMGEN-Removed
  2. 進一步增加PermGen的空間。

還有一個快速背景。與使用Spring的普通Java不同,Groovy和Grails在運行時產生了相當多的類(例如GSP)。 Groovy本身也產生了大量的類 - 每個閉包都是一個類。所有這些都給這個permgen帶來了壓力。

爲了緩和下來的壓力擺脫所有不必要的插件,鞏固GSP的,重新考慮關閉,使用AOP只有在絕對需要等

1

我們曾經有過類似的問題,所以我們的團隊開始使用每個應用程序的tomcat一個。我們還將證書與安全目的分開。現在管理它們更容易,監視日誌並定期更新。

提示:培訓管理員創建用戶,擁有tomcats實例的home_dirs並僅提供憑據更容易(imho和更簡潔)。