【问题标题】:stack overflow exception on xml transformationxml转换的堆栈溢出异常
【发布时间】:2012-06-09 17:41:25
【问题描述】:

我在 sun solaris 中托管的 weblogic server 10g 中的 xml 转换中收到以下 java stackoverflow 错误。这只发生在特定的 xml 转换中,其余所有 xml 转换都可以正常工作。使用的xsl文件也不是很大。

我正在使用 rt.jar 中提供的 Transformation api,但从我没有打包在我的应用程序中的 xalan apache 包 (com.sun.org.apache.xalan.internal.xsltc.dom.SimpleResultTreeImpl) 中收到此错误。

另一个有趣的事情是,当我在 Windows 机器上托管的 weblogic 10g 服务器中运行应用程序时,我没有得到这个异常,我只在 sun solaris 中得到这个。

谁能告诉我为什么会出现这个错误。

你能告诉我是哪个 jar 文件导致了异常吗? weblogic 会有 xalan.jar 吗?如果是这样,我可以尝试升级 jar 文件,看看它是否工作?

Caused by: java.lang.StackOverflowError
    at com.sun.org.apache.xalan.internal.xsltc.dom.SimpleResultTreeImpl.characters(SimpleResultTreeImpl.java)
    at com.sun.org.apache.xalan.internal.xsltc.dom.SimpleResultTreeImpl.copy(SimpleResultTreeImpl.java:438)
    at com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary.copy(BasisLibrary.java:1317)
    at GregorSamsa.replace()
    at GregorSamsa.replace()
    at GregorSamsa.replace()
    at GregorSamsa.replace()
    at GregorSamsa.replace()
    at GregorSamsa.replace()
    at GregorSamsa.replace()
    at GregorSamsa.replace()
    at GregorSamsa.replace()
    at GregorSamsa.replace()
    at GregorSamsa.replace()
    at GregorSamsa.replace()
    at GregorSamsa.replace()

【问题讨论】:

  • 好吧,如果没有 XSL 和示例 XML,任何人都很难提供帮助。罪魁祸首看起来像GregorSamsa类。
  • GregorSamsa 已经变成了一个错误!?
  • 执行应该是一样的,所以如果在solaris上不同,可能你的classpath/settings不同:你更新了所有other jars ,配置文件等在solaris上?检查您的环境是否相互匹配,而不仅仅是包含您的代码的 jar。
  • 如果可用 RAM 太低,可能会发生此错误。 Solaris 机器的 RAM 是否小于转换成功运行的机器上的 RAM?此外,还应该有定义可用堆栈和堆空间的运行时参数——两个不同平台上的默认值可能非常不同。
  • 一些事情。如果 xml 是高度嵌套和/或巨​​大的,我可能会看到堆栈溢出。其次,更有可能的是,您在其中一个环境中使用了不正确的 jar 版本。请注意,这并不意味着最新的 jar。

标签: java xml xslt stack-overflow


【解决方案1】:

根据对GregorSamsa.replace() 的所有调用,这里似乎发生了一些递归。它在 Windows 而不是 Solaris 上工作的事实可能是由于 JVM 的不同实现,或者更有可能是堆栈大小的默认 JVM 选项。

这里是 JVM stack size option does

这里是你可以increase the stack size in Eclipse.

以下是您如何通过命令行set the stack size 以及有关此主题的更多讨论:

$ javac TT.java
$ java -Xss4m TT

-Xss4m = 4 兆
-Xss1024k = 1024kb

如果您想从您的应用程序中启动一个新线程,并仅为该线程指定堆栈大小,请查看constructors for Thread class,包括:

public Thread(ThreadGroup group, Runnable target,String name,long stackSize)

【讨论】:

  • 非常感谢你们。将堆栈大小增加到 1024k 有效。但是这种增加是否会对性能产生副作用,因为它会从堆中借用一些内存?
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 2016-02-19
  • 2012-05-28
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
相关资源
最近更新 更多