0

Tomcat 有一个众所周知的内存泄漏问题,该问题会在重新部署过多后导致 PermGen 空间错误。

我想知道的是以完全重置该空间并消除现有内存泄漏的方式重新加载服务器的最佳实践。仅使用 shutdown.sh 和 startup.sh 并没有减少它:似乎泄漏的内存一直在泄漏。重新启动机器当然可以,但我想知道是否存在更快/更清洁/更安全的解决方案。

谢谢!

(当然,我可以分配更多的 PermGen 空间,但这只是延迟问题,我想在将应用程序声明为生产就绪之前清除泄漏的内存,因为我之后要换工作,因此应用程序暂时不会重新部署)

编辑:正如下面评论中提到的,似乎脚本应该已经刷新所有内存,因为它们创建了一个新的 JVM,所以在多次重新部署之后,即使在新的 JVM 中,一定还有其他一些因素导致 PermGen 错误继续发生。

4

3 回答 3

4

Tomcat 没有PermGen泄漏、webapp 重新部署与否。问题在于您的 webapp 本身、您使用的库,或者在某些情况下是 Java 标准库实现。所有这些都可以解决,而无需举起手臂并责怪Tomcat。

尝试阅读http://people.apache.org/~markt/presentations/2010-11-04-Memory-Leaks-60mins.pdf以了解如何正确诊断这些泄漏。给自己一个分析器(这甚至可以使用 JDK 中包含的免费实用程序来完成,例如 JVisualVM)。

Tomcat 7 包含一个内存泄漏预防实用程序,可以解决有问题的 Java API 实现(例如 AWT)。其他一切都是您的问题或您的图书馆的问题。大多数发现此类 PermGen 泄漏的开源库都已迅速修补其库以避免它们(或为客户端代码提供一种优雅的方式来避免 PermGen 泄漏)。

于 2012-07-04T20:23:38.833 回答
3

如果你还没有解决这个问题,你可以试试Plumbr。刚刚发布的版本也具有 PermGen 监控功能。

于 2012-07-12T12:44:07.790 回答
0

此脚本会在超过 95% 的物理内存时自动重启 Tomcat 服务器实例。享受!

porcentaje=95
usoMemoria=$(ps aux | grep tomcat | grep -v grep | awk '{printf ("%.0f", $4)}')
if [ $usoMemoria -ge $porcentaje ]; then
  echo "Se ha superado el tope (95%) de memoria que se ha establecido para el Tomcat. Se procede a su reinicio automatico"
  echo "$(date)"
  echo "Comenzando..."
  service tomcat7 restart
  echo "Terminando Script..."
fi
exit 0
于 2014-11-20T14:06:38.773 回答