有没有人知道为什么 Grails 应用程序在 tomcat 中运行 4 倍(6 和 7)比通过 grails run-app
运行?否则,我将不胜感激有关如何自行追踪此问题的一般性建议。
情况
我有一个 Web 应用程序可以执行一些相当密集的 XML 处理(解析、xpath、序列化)。对于大量输入,通过 grails dev run-app
运行时需要大约 5 秒才能返回结果。
当我在 tomcat6 中运行相同的应用程序时慢了 4 倍!
grails dev war
cp target/app.war /path/to/tomcat[6|7]/webapps
相同的应用程序、相同的环境、相同的机器:响应相同的 POST 需要 4 倍的时间(20 秒)。
- tomcat 中没有记录错误;只是我期望的日志输出
- Tomcat 在非 Debug模式下运行(Ubuntu 13.04 默认设置 +
-XX:MaxPermSize=512m
) - 相同的 Java 版本
更新
看起来下面的代码在 Tomcat 中运行速度大约慢了 12 倍:
XPathFactory.newInstance().newXPath()
... 嗯,我经常这样调用它。好吧,现在已经解决了,但我仍然想知道:
- 什么可能导致 Tomcat 中的速度如此之慢?
- 我可以采用哪些工具/方法来更轻松地得出这一发现? (我做了很多手动调试来解决这个问题。)
最佳答案
服务提供者机制决定使用哪个类作为XPathFactory的实现。包含文件 META-INF/services/javax.xml.xpath.XPathFactory
的类路径上的 JAR 文件可以替换 JRE 中的默认实现。
在您的案例中,开发环境和生产环境的类路径很可能不同。
要检查使用了哪个实现,您可以打印 XPathFactory.newInstance().newXPath().getClass()
。 JRE 中的内部实现是 com.sun.org.apache.xpath.internal.jaxp.XPathExpressionImpl
。
关于performance - Grails 性能 : XML processing 4x slower in tomcat than run-app?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18625399/