Jam*_*ams 8 java spring tomcat profiling hibernate
我有一个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
Run Code Online (Sandbox Code Playgroud)
也许这是问题的一部分?重新部署我的Web应用程序几乎总是需要重新启动Tomcat,我一直认为上面提到的JDBC驱动程序问题是罪魁祸首,但也许它也与缓慢的启动时间有关?
我对这类事情知之甚少,所以这是一个学习的真正机会.在此先感谢您的帮助.
你可以使用一个分析器,但这有点过分.相反,只需在应用程序加载时进行少量线程转储.您可以在网上使用jstack或使用jvisualvm大量资源来描述如何执行此操作.基本上你需要一个Tomcat的PID(参见:) jps.
如果您发现难以分析线程转储 - 将其添加到您的问题中.通常,很容易找到瓶颈.典型问题:
iostat/ iotop)首先,我要看的是tomcat在应用程序启动期间的CPU或RAM使用情况。
如果您看到大量的CPU活动和RAM增加,则可能是加载了很多东西,例如很多类,或者执行了某种巨大的预分配或类似工作。在这种情况下,线程转储可以为您提供很多帮助,但是也可以通过“ lsof”(如果您的tomcat在* nix环境中运行)来帮助您查看当前正在处理的文件。
但是,如果您看到它只是坐在那里,那么它可能正在等待某种连接。
如您所料,一个原因可能是数据库连接。数据库通常响应速度很快,并且连接到数据库的失败尝试通常可以清楚地记录在某处,但仍然可以。
另一个鲜为人知的原因可能是一些XML验证。Web应用程序加载一些XML数据并不少见,并且使用验证解析器加载该XML并不少见。验证解析器需要模式或DTD进行验证,并且XML中通常包含模式/ DTD文件的URL。因此,某些解析器将尝试从Internet加载架构文件以验证XML,而建立Internet连接可能要花费很多时间。而且,某些解析器可能会安静地失败,并且可能在相当长的超时后根本无法验证XML。很抱歉在“某些解析器”等上含糊不清。但是,如果XML加载是由Webapp内部使用的库完成的,则他们可以使用JVM XML解析器,任何可能的Xerces版本,任何可能的JDOM版本等。
但是,如果是连接问题,则可以使用“ netstat -anlp | grep java”(在您的tomcat在* nix环境中,否则在Windows上应为“ netstat -ano”)更容易地查看它,并查找您的tomcat正在尝试建立什么传出连接。在这里,您可以看到数据库连接以及用于搜索方案或其他内容的传出(通常为http)连接。