2012-04-19 125 views
8

我們正在運行在Tomcat 6,每個portlet一個Liferay門戶是一個包含Web應用程序,使它包含門戶本身需要的所有庫。我們目前有30多個portlet。這樣做的結果是我們的tomcat的permgen隨着我們部署的每個portlet而增加。大PermGen的大小+性能的影響

我們現在有兩條路,我們可以遵循。 將我們每個portlet使用的一些庫移動到tomcat共享庫。這將包括東西像春天/休眠/ CXF/....以減少我們的PermGen大小 或更容易將增加的PermGen大小。

第二個選項允許我們將每個portlet作爲一個獨立實體。

現在的問題是,有沒有從增加PermGen的大小性能的負面影響?我們目前運行在512MB。 我發現很少或沒有關於此的信息。但發現一些帖子是人們正在談論1024MB permgen大小運行沒有問題。

+0

我不希望1 GB PermGen導致問題。 – 2012-04-19 13:45:12

+1

相關問題:http://stackoverflow.com/q/9636328/1140748 – 2012-04-19 13:52:49

+0

這並沒有回答你的問題,但增加了另一個方面:我認爲每個插件有1個portlet是人爲限制的決定。隨着你給的portlet的數量,我敢打賭,有一些相關的地方我會建議考慮將包裝相關的一起考慮在一起。這將照顧你的痛苦,恕我直言,增加你的插件概述。 – 2012-04-21 07:50:03

回答

3

只要你有足夠的內存在你的服務器上,我無法想象任何事情都可能出錯。如果你不這樣做,那麼Tomcat甚至可能不會啓動,因爲它無法分配足夠的內存。所以,如果它啓動了,你就很好。據我的經驗,1GB PermGen是完美的。

大型PermGen的不足之處在於,它爲您留下的系統內存較少,您可以將其分配給堆(Xmx)。

另一方面,我建議您重新考慮將Portlet視爲獨立實體的好處。例如:

  • 互操作性問題:如果所有portlet允許可能使用不同版本的同一個庫,有一定的風險,他們不會互相和與門戶本身作爲目的
  • 合作
  • 性能:PermGen佔用空間只是一件事,但在portlet中每次在這裏和那裏添加jar都需要額外的文件描述符;我不瞭解Windows,但從長遠來看,這會損害Linux服務器的性能。變化的
  • 自由:如果你使用Maven構建你的門戶,從lib/ext庫到portlet的lib庫開關只是一個改變依賴範圍(這可能是與門戶庫更惱人)的事;據我記得,Liferay的SDK也可以很容易地做一個類似開關與螞蟻通過添加額外的Ant任務來解決依賴性和portlet的lib刪除它們所需
+0

perm gen不是java堆的一部分,它不會對Xmx產生任何影響 – 2012-04-22 04:24:13

+0

它不會自行完成 - 但它會讓您用更少的內存爲Xmx分配內存,不是嗎? – 2012-04-22 07:21:27

+0

是的,你是對的Michal - 沒有把'less memory'看作'less system memory'。 – 2012-04-23 13:59:16

1

做在一個瞬間的類似開關PermGen內存可以通過完整集合進行垃圾回收,因此增加它可能會增加完整集合發生時的GC時間。

這些集合不應該經常發生,而且通常對於完整的GC 1GB的permgen內存來說還不到一秒鐘 - 我只是從(我有點模糊的)內存中抽取這個數字,所以如果你真的擔心GC倍到一些時間測試自己(使用-verbose:gc和讀取日誌,更多的細節here

0

PermGen的大小是舊的根之外 - 所以請不要混淆。 同意第二點 - 我們可以儘可能地增加permsize - 因爲內存相當便宜,但這會引發一些關於我們如何管理代碼的問題。爲什麼我們需要這麼多的燙髮--Jaa消耗那麼多 - 我們加載了多少班?應用程序打開多少個文件描述符(使用lsof命令進行檢查)。 我們應該嘗試回答這些問題。

+0

這不提供問題的答案。要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的[聲譽](http://stackoverflow.com/help/whats-reputation),你會能夠[評論任何帖子](http://stackoverflow.com/help/privileges/comment)。 – 2014-10-20 12:59:06

+0

因爲我猜,混淆的指責指向了我的答案,所以我重新修改了這個短語使其更加清晰。我的意思是說,增加給PermGen一些系統內存將使您獲得更少的「蛋糕」,然後交給Xmx。至於你的內存使用問題,好吧,你完全正確地理解你的困惑,但是OP正在運行liferay,Liferay爲你部署的每個portlet創建單獨的ClassLoader。這可能意味着整個例如彈簧被多次加載,這就是PermGen輕鬆通過Liferay進入屋頂的方式。 – 2015-07-07 16:37:26