【发布时间】:2012-10-08 05:24:21
【问题描述】:
我们的网络应用遇到了复杂的情况
是STS/Tomcat 7开发的Spring应用。应用程序与Jasper report 4.6.0 集成后,总是抛出`OutOfMemoryError: PermGen Space.然后让它工作的唯一方法是重新启动应用程序。但过了一会儿又发生了。
这是异常之前的日志:
Oct 17, 2012 3:42:27 PM org.apache.jasper.compiler.TldLocationsCache tldScanJar
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
Oct 17, 2012 3:42:30 PM org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
这是异常中的一个部分,我在其中发现了一些关于 Jasper 的信息:
at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:442)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:378)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
at org.apache.jasper.servlet.JspServletWrapper.loadTagFile(JspServletWrapper.java:240)
at org.apache.jasper.compiler.TagFileProcessor.loadTagFile(TagFileProcessor.java:578)
at org.apache.jasper.compiler.TagFileProcessor.access$000(TagFileProcessor.java:49)
at org.apache.jasper.compiler.TagFileProcessor$TagFileLoaderVisitor.visit(TagFileProcessor.java:655)
以下是出现这种情况时的一些发现:
该问题可能发生在没有任何 Jasper 报告组件的页面上。当
a request is processed by the back end and responded to the front end时,Jasper Report bean 似乎一直在尝试查找标记库。通常从日志文件中我可以看到,在所有后端操作(JPA 管理)完成之前,上述异常不会抛出-
在调试模式下运行 log4J 时,我看到大量信息显示诸如解析/渲染 Jasper 模板中的所有组件(文本字段、笔、框...),从巨大的日志中有一个小切口:
2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester.sax -- startElement(http://jasperreports.sourceforge.net/jasperreports,textElement,textElement) 2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester -- Pushing body text '' 2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester -- New match='jasperReport/summary/band/textField/textElement' 2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester -- Fire begin() for FactoryCreateRule[className=net.sf.jasperreports.engine.xml.JRTextElementFactory, attributeName=null, creationFactory=net.sf.jasperreports.engine.xml.JRTextElementFactory@12dc6007] 2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester -- [FactoryCreateRule]{jasperReport/summary/band/textField/textElement} New net.sf.jasperreports.engine.design.JRDesignTextField 2012-10-17 15:29:12,025 -- DEBUG -- org.apache.commons.digester.Digester.sax -- ignorableWhitespace()不过,当对不包含任何 Jasper 组件的页面的请求时,会生成此日志。
我做了一些研究,但仍然找不到解决此问题的方法。
第一个问题是即使应用程序中有一个
jasperreport bean,为什么它甚至没有与当前服务自动连接时它总是在运行(意味着当前页面没有任何碧玉组件)。这种情况有解决方案/答案吗?-
同样来自异常消息 至少对一个 JAR 进行了 TLD 扫描,但未包含 TLD。 在 org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:442)
应该来自 Tomcat 和
Tomcat never contains any JSTL jar,那么我假设它找不到匹配的 TLD 来解析 jasper 报告,因此对所有 jar 进行全面扫描。如果是这样,那为什么org.apache.commons.digester.Digester的大量调试日志实际上似乎忙于解析 jasper 模板?
一般来说,做这个线程只是想办法找出问题的解决方案,同时也找到为什么Jasper在一个不需要它的地方如此活跃的答案,以及我们如何让tomcat正确解析模板?
如果过于冗长,请道歉,并感谢任何提示。
【问题讨论】:
-
那么,您是否尝试过增加 PermGen 的大小?好像没有很多其他的方法。
-
@Frank Pavageau 是的,我试过了,将其设置为 512M,但仍然遇到同样的问题...是在
catalina.sh和 JAVA_OPTS="...-XX:MaxPermSize=512m 中吗? ." ? -
@FrankPavageau 似乎 jasper 报告的某些配置存在此类问题,因此排除 jasper 报告中的根本原因很可能是可行的。
-
@eis 请告诉我如何在 Jasper Report 中追踪根本原因,或者我应该尝试 HeapDumpOnOutOfMemoryError 吗?谢谢。
-
@Dreamer 尝试一下,获取错误情况的堆转储并分析这应该是向前迈出的一步
标签: java spring tomcat jasper-reports jstl