Tomcat有一个众所周知的内存泄漏问题,在重新部署太多后会导致PermGen空间错误。
我想知道的是以完全重置该空间并擦除现有内存泄漏的方式重新加载服务器的最佳实践。只是使用shutdown.sh和startup.sh并没有削减它:泄漏的内存似乎一直在泄露。重新启动机器当然有效,但我想知道是否存在更快/更清洁/更安全的解决方案。
谢谢!
(当然,我可以分配更多的PermGen空间,但这只是推迟了问题,我想在将应用程序宣布为生产就绪之前清除泄露的内存,因为我之后正在更换工作因此,应用程序暂时不会重新部署)
编辑:正如下面的评论中提到的,似乎脚本应该已经刷新所有内存,因为它们创建了一个新的JVM,因此必须有一些其他因素导致PermGen错误在即使在新的JVM中仍然发生,之后许多重新组合。答案 0 :(得分: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泄漏)。
答案 1 :(得分:3)
如果您尚未解决此问题,可以尝试Plumbr。刚发布的版本也具有PermGen监控功能。
答案 2 :(得分: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