我有一个Web应用程序,通常需要花费大量时间在Tomcat上进行部署。我怀疑是某个数据库连接正在等待超时,但这只是一个猜测,我想确定是什么导致了阻塞,所以我可以解决这个问题。任何人都可以建议我可以这样做吗?我应该在加载WAR时查看Tomcat并查找线索吗?如果有,那么某个地方的教程对初学者有好处吗?
如果这很重要,我的Web应用程序使用Spring和Hibernate。一位同事告诉我,这可能会导致速度变慢,因为它们非常庞大,以至于某个类加载器正在窒息它需要加载的大量类。
当我停止Tomcat或将WAR热部署到已经运行的Tomcat时,我也看到了这一点:
Jun 1, 2012 6:03:33 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [/nacem-rest] registered the JDBC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
Jun 1, 2012 6:03:34 PM org.apache.catalina.startup.HostConfig deployWAR
也许这是问题的一部分?重新部署我的Web应用程序几乎总是需要重新启动Tomcat,我一直认为上面提到的JDBC驱动程序问题是罪魁祸首,但也许它也与缓慢的启动时间有关?
我对这类事情知之甚少,所以这是一个学习的真正机会。在此先感谢您的帮助。
答案 0 :(得分:7)
您可以使用分析器,但这有点过分。相反,只需在应用程序加载时进行少量线程转储。您可以使用jstack
或jvisualvm
,网上有大量资源来描述如何执行此操作。基本上你需要一个Tomcat的PID(参见:jps
)。
如果您发现很难分析线程转储 - 请将其添加到您的问题中。通常,很容易找到瓶颈。典型问题:
iostat
/ iotop
)答案 1 :(得分:4)
我要看的第一个是在应用程序启动期间tomcat的CPU或RAM使用情况。
如果你看到很多CPU活动和RAM增加,那么它可能会加载很多东西,比如很多类,或者执行某种巨大的预分配或类似的东西。在这种情况下,线程转储可以帮助你很多,但也“lsof”(如果您的tomcat在* nix环境中运行),以查看它当前正在处理的文件。
然而,如果你看到它只是坐在那里,那么它可能正在等待某种连接。
正如您所想,一个原因可能是数据库连接。数据库通常可以快速回答,并且连接到数据库的失败尝试通常会在某处清楚地记录下来,但它仍然可能存在。
另一个鲜为人知的原因可能是某些XML验证。 Web应用程序加载某些XML数据的情况并不少见,使用验证解析器加载该XML的情况并不少见。验证解析器需要模式或DTD来验证,并且模式/ DTD文件的URL通常包含在XML中。因此,一些解析器将尝试从Internet加载模式文件以验证XML,这可能需要花费大量时间进行Internet连接。此外,一些解析器将无声地失败并且只是在相当长的超时之后不能验证XML。很抱歉对“一些解析器”等模糊不清..但是如果XML加载是由webapp中使用的库完成的,那么他们可以使用JVM XML解析器,任何可能的Xerces版本,JDOM等任何可能的版本......甚至最差的库可能正在使用不同的解析器。
但是,如果是连接问题,使用“netstat -anlp | grep java”更容易看到它(在你的tomcat中是* nix环境,否则它应该是windows上的“netstat -ano”),并寻找你的tomcat试图做出的传出连接。在那里,您可以看到数据库连接以及搜索方案或其他内容的传出(通常是http)连接。
答案 2 :(得分:4)
如果您使用的是Tomcat 7.0.x,则可能正在扫描类路径以检测注释。 如果你有很多罐子/类,那么这可能是一个问题。
正如Simone所说,采取和分析几个线程转储是一个很好的开始。
如果您没有使用最新版本的Tomcat,请尝试升级&检查conf / catalina.properties文件以获取有关如何减少扫描的jar数量的提示。
答案 3 :(得分:3)
您应该在部署期间进行一些线程转储(越多越好),并对其进行分析。寻找块,等待等等。Thread Dump Analyzer可能有用。
答案 4 :(得分:1)
这可能与此BUG of JDK
有关我恳求this article, Tomcat7 starts too late on Ubuntu 14.04 x64并解决了我的问题。
尝试通过替换 securerandom.source =文件来解决它:/ dev / urandom with securerandom.source = file:/ dev /./ urandom in $ JAVA_PATH / jre / lib / security / java 。安全
答案 5 :(得分:0)
我发现在将Web应用程序部署到Tomcat8时遇到了很大的延迟。我在WAR中的context.xml文件中配置了三个数据库连接池。每个连接池的初始计数为10个连接,因此Tomcat在启动时创建了30个数据库连接。我发现在我的测试系统上为每个池配置1个初始连接可以将部署时间从大约3分钟提高到22秒。
答案 6 :(得分:-3)
在您工作setenv.sh
目录的tomcat7/bin
下方附加:
JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"