我怎样才能知道在Tomcat上部署我的WAR这么长时间?

时间:2012-06-01 21:27:59

标签: java spring hibernate tomcat profiling

我有一个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驱动程序问题是罪魁祸首,但也许它也与缓慢的启动时间有关?

我对这类事情知之甚少,所以这是一个学习的真正机会。在此先感谢您的帮助。

7 个答案:

答案 0 :(得分:7)

您可以使用分析器,但这有点过分。相反,只需在应用程序加载时进行少量线程转储。您可以使用jstackjvisualvm,网上有大量资源来描述如何执行此操作。基本上你需要一个Tomcat的PID(参见:jps)。

如果您发现很难分析线程转储 - 请将其添加到您的问题中。通常,很容易找到瓶颈。典型问题:

  • 应用程序尝试从Internet获取某些资源,如XML架构
  • 很多要在CLASSPATH上扫描的类
  • 过多的GC(启用详细的gc日志记录以防万一)
  • 内存不足(交换,请参阅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"