OutOfMemoryError: PermGen Space - отчет Jasper с Spring, работающим на Tomcat
Наше веб-приложение столкнулось со сложной ситуацией
Это приложение Spring, разработанное STS /Tomcat 7
, После того, как приложение было интегрировано с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 Report. Кажется, что бин Jasper Report все время пытается найти тег liba request is processed by the back end and responded to the front end
, Обычно из файла журнала, который я вижу выше, исключение не будет выброшено, пока не завершены все операции с сервером (управление JPA)
Когда я запускаю log4J в режиме отладки, я вижу кучу информации, показывающей что-то вроде разбора / рендеринга всех компонентов из шаблона Jasper (textfields, pen, box ...), есть небольшой отрыв от огромного журнала:
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
в приложении, почему он всегда работает, когда он даже не подключен автоматически с текущей службой (то есть текущая страница не имеет компонента jasper). Есть ли решение / ответ на эту ситуацию?
Также из сообщения об исключении По крайней мере один 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 настолько активен в местах, где это не требуется, и как мы можем позволить tomcat правильно проанализировать шаблоны?
Прошу прощения, если слишком многословен, и спасибо за любые подсказки.