在我的 grails 应用程序中使用 Jasper Reports 时,我在生成 PDF 时遇到了严重的性能问题。我正在调用 jasperService:
def reportDef = jasperService.buildReportDefinition(parameter, LocaleContextHolder.getLocale(), [data: emptyData])
在Jboss中运行了几次,性能不错。X 小时后,性能比 Jboss 启动后差 100 倍以上……响应时间从 7-12 秒变为几分钟,用于创建单页 PDF。我确信,性能滞后在这个调用中,因为我在它周围添加了时间测量。由于报告数据在参数中传递,我也可以排除数据库连接问题。
我已经分析了 HEAP,但它使用了大约 50%,并且在 PDF 创建期间没有太大变化。整体内存也没有完全使用。我已经分析了 PermGen,但它还远远不够。
在创建过程中 CPU 始终处于 100%,这没关系,因为 PDF 创建非常消耗 CPU。我已经确保没有其他进程阻止 PDF 创建,第一次通过多次重新启动进程并且测量没有差异,所以我可以排除外部中断,第二次)知道如果重新启动 JBoss,性能会好得多。
由于事实,我已经开始通过在运行 PDF 创建线程时分析线程转储来分析 JBoss 本身。我看到没有其他东西在运行(除了线程转储线程),无论是在重新启动后速度慢还是快时。我可以看到,在几个线程转储中,Groovy 正在进行几个 AST 转换,这对 Groovy 来说并不奇怪......
现在,我很绝望。HEAP/PermGen 没问题,CPU 没问题。Jasper Reports / Grails 到底在做什么?
也许有人有类似的经历或根本原因的想法?Jasper Reports 中是否有需要/应该清理的内容?
编辑:我的进一步分析得出了未经证实但确定的结果,即 JBoss 7.1.1(最新稳定版)是根本原因。在 Tomcat 上安装应用程序后,一切运行顺利,几天后也是如此。我会保持这个开放。也许有人有同样的经历并喜欢发布它......?否则,我将使用此解决方案关闭它。我可能会在早期版本的 Jboss 或 7.2/7.3 上测试我的应用程序。