8

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

我们现在有两条可以遵循的路径。将我们每个 portlet 常用的一些库移动到 tomcat 共享库中。这将包括诸如 spring/hibernate/cxf/.... 之类的东西来减小我们的 permgen 大小或更容易的是增加 permgen 大小。

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

现在的问题是,增加 permgen 大小是否会对性能产生负面影响?我们目前以 512MB 运行。我几乎没有找到关于这方面的信息。但是发现一些帖子是人们谈论在 1024MB permgen 大小上运行而没有问题。

4

3 回答 3

3

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

大型 PermGen 的缺点是它留给您的系统内存更少,您可以为堆 (Xmx) 分配内存。

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

  • 互操作性问题:如果允许所有 portlet 潜在地使用相同库的不同版本,则存在一些风险,即它们不会按预期相互合作以及与门户网站本身合作
  • 性能:PermGen 占用空间只是一件事,但是在 portlet 中到处添加 jar 将需要额外的文件描述符;我不了解 Windows,但从长远来看,这会损害 linux 服务器的性能。
  • 更改自由:如果您使用 maven 构建您的 portlet,从lib/extlib 切换到 portlet 的lib库只是更改依赖范围的问题(这可能对门户库更烦人);lib据我记得,Liferay SDK 还可以通过添加额外的 ant 任务来解决依赖关系并根据需要从 portlet 中删除它们,从而可以轻松地使用 ant 进行类似的切换。
于 2012-04-22T01:27:23.087 回答
1

PermGen 内存可以通过完全回收进行垃圾回收,因此增加它可能会增加完全回收发生时的 GC 时间。

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

于 2012-04-22T01:50:33.217 回答
0

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

于 2014-10-20T12:39:32.457 回答