TomCat Servlet 执行 java.lang.StackOverflowError 异常

问题描述

我在服务重启后第一次调用 Apache TomCat 8.5.51 时随机收到以下错误。一段时间后错误自动消失,这使得调试变得非常困难。

可能是什么原因?

错误日志:

    27-Jul-2021 13:40:44.965 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log ContextListener: attributeAdded('StockTicker','async.Stockticker@75f16954')
    27-Jul-2021 13:41:03.686 SEVERE [http-nio-8080-exec-1] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [Cocoon] in context with path [/cocoon-2.1.11] threw exception [Servlet execution threw an exception] with root cause
        java.lang.StackOverflowError
            at org.apache.xml.utils.SuballocatedIntVector.<init>(SuballocatedIntVector.java:115)
            at org.apache.xml.dtm.ref.DTMDefaultBase.<init>(DTMDefaultBase.java:207)
            at org.apache.xml.dtm.ref.DTMDefaultBaseTraversers.<init>(DTMDefaultBaseTraversers.java:90)
            at org.apache.xml.dtm.ref.DTMDefaultBaseIterators.<init>(DTMDefaultBaseIterators.java:85)
            at org.apache.xml.dtm.ref.sax2dtm.SAX2DTM.<init>(SAX2DTM.java:253)
            at org.apache.xml.dtm.ref.sax2dtm.SAX2DTM.<init>(SAX2DTM.java:224)
            at org.apache.xml.dtm.ref.sax2dtm.SAX2RTFDTM.<init>(SAX2RTFDTM.java:126)
            at org.apache.xml.dtm.ref.DTMManagerDefault.getDTM(DTMManagerDefault.java:307)
            at org.apache.xpath.XPathContext.getRTFDTM(XPathContext.java:1258)
            at org.apache.xpath.XPathContext.pushRTFContext(XPathContext.java:1275)
            at org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:386)
            at org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
            at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
            at org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
            at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)
    org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:248)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:141)
    org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
    org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394)

解决方法

java.lang.StackOverflowError 根据 docs

由于应用程序递归得太深而发生堆栈溢出时抛出。

从堆栈跟踪中,可以在下面的几行中看到递归。 ElemTemplate.execute 调用 TransformerImpl.executeChildTemplates,后者依次调用前者从而建立递归:

org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2400)
org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:394). 

xml 结构中的某些内容或解析它的代码可能会导致 java.lang.StackOverflowError
也值得一试-Xss jvm setting

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...