【问题标题】:StackOverFlowError when using SAXReader after Java security updateJava 安全更新后使用 SAXReader 时出现 StackOverFlowError
【发布时间】:2012-09-12 16:52:31
【问题描述】:

运行 Mac (OS X 10.8.1)。我们已升级到最新的 Java 安全更新 1.6.0_35-b10-428,此后我们的主应用程序无法在 Eclipse 中启动。

启动 Openfire 3.6.4 时会引发以下异常。解析 openfire.xml 配置的地方几乎就是错误发生的时候:

 private void buildDoc(Reader in) throws IOException {
    try {
        SAXReader xmlReader = new SAXReader();
        xmlReader.setEncoding("UTF-8");
        document = xmlReader.read(in);
    }
    catch (Exception e) {
        Log.error("Error reading XML properties", e);
        System.out.println("NOOO");
        e.printStackTrace();
        throw new IOException(e.getMessage());
    }
    finally {
        if (in != null) {
            in.close();
        }
    }
}

抛出异常:

Exception in thread "main" java.lang.StackOverflowError
at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:52)
at java.nio.ByteBuffer.wrap(ByteBuffer.java:350)
at java.nio.ByteBuffer.wrap(ByteBuffer.java:373)
at java.lang.StringCoding$StringEncoder.encode(StringCoding.java:237)
at java.lang.StringCoding.encode(StringCoding.java:272)
at java.lang.String.getBytes(String.java:946)
at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:228)
at java.io.File.exists(File.java:733)
at sun.misc.URLClassPath$FileLoader.getResource(URLClassPath.java:999)
at sun.misc.URLClassPath.getResource(URLClassPath.java:169)
at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.dom4j.DocumentFactory.createDocument(DocumentFactory.java:102)
at org.dom4j.DocumentFactory.createDocument(DocumentFactory.java:122)
at org.dom4j.io.SAXContentHandler.createDocument(SAXContentHandler.java:830)
at org.dom4j.io.SAXContentHandler.getDocument(SAXContentHandler.java:164)
at org.dom4j.io.SAXContentHandler.comment(SAXContentHandler.java:428)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.comment(AbstractSAXParser.java:667)
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.comment(XMLDTDValidator.java:978)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:479)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at org.dom4j.io.SAXReader.read(SAXReader.java:465)
at org.dom4j.io.SAXReader.read(SAXReader.java:365)
at org.jivesoftware.util.XMLProperties.buildDoc(XMLProperties.java:471)
at org.jivesoftware.util.XMLProperties.<init>(XMLProperties.java:114)
at org.jivesoftware.util.XMLProperties.<init>(XMLProperties.java:63)
at org.jivesoftware.util.JiveGlobals.loadSetupProperties(JiveGlobals.java:832)
at org.jivesoftware.util.JiveGlobals.getXMLProperty(JiveGlobals.java:282)
at org.jivesoftware.util.JiveGlobals.isSetupMode(JiveGlobals.java:791)
at org.jivesoftware.util.JiveGlobals.getProperty(JiveGlobals.java:529)
at org.jivesoftware.openfire.XMPPServer.initialize(XMPPServer.java:300)
at org.jivesoftware.openfire.XMPPServer.start(XMPPServer.java:419)
at org.jivesoftware.openfire.XMPPServer.<init>(XMPPServer.java:163)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at org.jivesoftware.openfire.starter.ServerStarter.start(ServerStarter.java:106)
at org.jivesoftware.openfire.starter.ServerStarter.main(ServerStarter.java:51)

编辑:按照建议添加了 Xss1m,但是当应用程序进一步发展时,我看到了同样的错误。这是我的启动参数:

这是我的启动参数:

-DopenfireHome="${workspace_loc:openfire}/target/openfire" -Djava.net.preferIPv4Stack=true -Xms32m -Xmx512m -Xss1m -XX:ThreadStackSize=128 -XX:PermSize=72m -XX:MaxPermSize=96m -XX:+PrintGCDetails -Xloggc:/tmp/gc.log -XX:+HeapDumpOnOutOfMemoryError

编辑2:

似乎以下修改有效: 将 -Xss128k 修改为 -Xss1m 并删除 -XX:ThreadStackSize=128

【问题讨论】:

    标签: java macos stack-overflow


    【解决方案1】:

    您是否尝试增加堆栈大小?您可以通过在启动 JVM 时指定 -Xss1m 来实现。在示例中,JVM 将为每个线程分配 1 兆字节的堆栈。注意不要使用太大的值,因为它会乘以应用程序中的线程数。

    要更改 Eclipse 中的配置,请按照以下步骤操作(复制自 here)。


    为您的应用程序打开运行配置(运行/运行配置...,然后在“Java 应用程序”中查找应用程序条目)。

    参数选项卡有一个文本框 Vm 参数,输入 -Xss1m(或更大的参数以获得最大堆栈大小)。默认值为 512 kByte。


    编辑:

    这似乎是一个常见问题。安全补丁可能会向链中引入另一个方法调用,并且过去适合堆栈的所有项目都不再适合了。

    【讨论】:

    • 谢谢,它有点进一步,但一段时间后仍然显示相同的错误。在上面发布了我的启动参数。
    • 您可以尝试不使用此选项-XX:ThreadStackSize=128 恕我直言,它与-Xss 选项冲突。还要对其进行测试,尝试将-Xss 设置为更高的值,例如-Xss10m,这很多,但如果它因 10Mb 的堆栈而崩溃,那么可能会无限重复。
    猜你喜欢
    • 2020-09-02
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 2022-10-24
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多