2012-04-19 110 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