大型Permgen尺寸+性能影响

时间:2012-04-19 13:42:30

标签: java tomcat6 liferay portal permgen

我们正在tomcat 6上运行liferay门户。每个portlet都是一个包含的Web应用程序,因此它包含了portlet本身所需的所有库。我们目前有30多个portlet。结果是我们的tomcat的permgen随着我们部署的每个portlet而增加。

我们现在有两条路可以遵循。 将每个portlet通常使用的一些库移动到tomcat共享库。这将包括像spring / hibernate / cxf / ....这样的东西来减少我们的permgen大小 或者更容易增加permgen大小。

第二个选项允许我们将每个portlet保持为一个自包含的实体。

现在的问题是,增加permgen大小会对性能产生负面影响吗?我们目前的运行速度为512MB。 我发现很少甚至没有关于此的信息。但是发现有些帖子是人们在谈论以1024MB permgen大小运行而没有问题。

3 个答案:

答案 0 :(得分:3)

只要你的服务器上有足够的内存,我无法想象任何事情都可能出错。如果你不这样做,那么Tomcat甚至可能都不会启动,因为它无法分配足够的内存。所以,如果确实启动了,那你很好。就我的经验而言,1GB PermGen完美无缺。

大型PermGen的缺点是它会为您留下较少的系统内存,然后您可以为堆分配(Xmx)。

另一方面,我建议您重新考虑将portlet视为自包含实体的好处。例如:

  • 互操作性问题:如果允许所有portlet可能使用相同库的不同版本,则存在一些风险,即它们不会彼此合作并且与门户网站本身无法合作
  • 性能:PermGen足迹只是一件事,但在portlet中每次添加jar都需要额外的文件描述符;我不了解Windows,但从长远来看这会损害linux服务器的性能。
  • 变革自由:如果您使用maven构建portlet,从lib/ext libs切换到portlet的lib库只需要更改依赖项范围(对于门户网站来说,这可能会更烦人);据我所知,Liferay SDK还可以通过添加额外的ant任务来解决依赖关系并根据需要从portlet的lib中删除它,从而可以轻松地使用ant进行类似的交换以快速执行类似的切换。 LI>

答案 1 :(得分:1)

PermGen内存可以被完整集合垃圾收集,因此增加它可能会增加完整集合发生时的GC时间。

这些集合不应该经常发生,并且通常仍然需要不到一秒钟的完整GC 1GB的permgen内存 - 我只是从(我有些模糊的)内存中提取这个数字,所以如果你是真的很担心自己的GC时间到一些时间测试(使用-verbose:gc并阅读日志,更多细节here

答案 2 :(得分:0)

Permgen尺寸在OLD Gen之外 - 所以请不要混淆。 同意第二点 - 我们可以尽可能多地增加permsize - 因为内存相当便宜但这会引发一些关于我们如何管理代码的问题。为什么我们需要这么多烫发 - 这是JTa耗费那么多 - 我们要装多少班?应用程序打开了多少个文件描述符(使用lsof命令检查)。 我们应该尝试回答这些问题。