相关疑难解决方法(0)

xml转换的堆栈溢出异常

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

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

另一个有趣的事情是,当我在 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() …
Run Code Online (Sandbox Code Playgroud)

java xml stack-overflow xslt

5
推荐指数
1
解决办法
2631
查看次数

StackOverflowError 之前有多少次递归调用?

如果我在Java中递归调用一个方法,我可以提前知道在得到StackOverflowException之前有多少次调用会成功吗?即某种堆栈大小有望在 WAS 中配置?

java

5
推荐指数
1
解决办法
3906
查看次数

堆栈溢出解析ANTLR4中的非常大的表达式

我正在 ANTLR4 中重新实现现有的 DSL。现有的源代码主体有一些非常大的表达式。ALL(*) 逻辑中的递归似乎意味着我可以解析的表达式有多大限制。

示例语法:(刚好足以重现这里的错误错误)

  grammar A4Test;

  fragment DIGIT : [0-9];

  fragment ALPHA : [a-zA-Z];


  WS  :   [ \t\r\n\u000D'] {skip();};
    
  ID  :   ALPHA (ALPHA|DIGIT)*;
        
  NUMBER : '-'?(DIGIT+|(DIGIT*'.'DIGIT+));
     
  e : expr;
          
  expr : '(' expr ')'
    |   expr 'OR' expr
    |   expr 'AND' expr
    |   ID
    |   NUMBER
    ; 
 
Run Code Online (Sandbox Code Playgroud)

样本输入:

V0 AND 0 OR
V1 AND 1 OR
...  (MANY rows elided)
V3999 AND 3999 OR
V4000 AND 4000
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪:

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) …
Run Code Online (Sandbox Code Playgroud)

antlr4

5
推荐指数
1
解决办法
968
查看次数

Neo4j java.lang.StackOverflowError

我正在尝试在 PC(或更准确地说,运行 Neo4j 2.1.0 的 MacBookPro 10.9.2)上创建一个相对较小的 Neo4j 数据库,由 1400 个 CREATE 语句组成。当我通过终端加载图形文件时,我收到以下错误消息(整个堆栈跟踪对于 Stackoverflow 来说太长,但这里是错误消息和引起原因列表的前三行):

Error occurred in server thread; nested exception is:     
java.lang.StackOverflowError
java.rmi.ServerError: Error occurred in server thread; nested exception is:     
java.lang.StackOverflowError
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:350)
at sun.rmi.transport.Transport$1.run(Transport.java:177)
at sun.rmi.transport.Transport$1.run(Transport.java:174)
Run Code Online (Sandbox Code Playgroud)

...

Caused by: java.lang.StackOverflowError
at org.neo4j.cypher.internal.compiler.v2_1.ReattachAliasedExpressions$.apply(ReattachAliasedExpressions.scala:31)
at org.neo4j.cypher.internal.compiler.v2_1.ReattachAliasedExpressions$$anonfun$2.apply(ReattachAliasedExpressions.scala:36)
at org.neo4j.cypher.internal.compiler.v2_1.ReattachAliasedExpressions$$anonfun$2.apply(ReattachAliasedExpressions.scala:36)
at scala.Option.map(Option.scala:145)
Run Code Online (Sandbox Code Playgroud)

我可以将所有 1400 个创建语句加载到包含 300 个创建语句的单独文件中,因此我的 Cypher 似乎是正确的。如何增加堆栈大小以便上传更大的 Neo4j 数据库?(我正在通过大量的 xml 创建数据库,并期望在最终分析中必须有大约 3000 个节点和大约 4000 个关系)。

java stack-overflow neo4j

5
推荐指数
1
解决办法
1321
查看次数

JVM堆栈大小规范

我有一个常规的64位热点JVM,其堆栈大小为1 MB.现在我试图序列化一个具有3022个父级的层次结构的对象,这给了我SO(反讽)异常.

这是一些代码:

while(epc.getParent()!=null){

      epc=epc.getParent();
      count++;
     }
     print(count);//3022
Run Code Online (Sandbox Code Playgroud)

上面的代码只是告诉层次结构,但当我尝试将epc对象序列化到ObjectOutputStream 时,会发生实际问题.

问题,JVM中1 MB堆栈大小的状态是什么,因为我不知道堆栈帧的大小是多少?我确定每个堆栈帧不是1KB,因为我在-Xss3000k成功运行了代码.

还有一个问题,如果我放置-Xss3000k的JVM选项,每个线程的堆栈大小是否为3000k?

java jvm jvm-hotspot

3
推荐指数
1
解决办法
5260
查看次数

使用递归斐波那契函数时发生堆栈溢出错误

这是我的代码,它运行良好,值为400到4000,但一旦它大约4mil,我得到堆栈溢出错误.

提前致谢!

public class Fib {
static int c=1,b=2;
static long sum1=0,sum2=0;

static long fib(long a){
if(a==1){
    return 1;
}
if(a==2){
    return 2;
}
else{
    return fib(a-1)+fib(a-2);
}

    }


    public static void main(String[] args){
sum2= fib(4000000);
    System.out.println("Sum %f" +sum2);
}
    }
Run Code Online (Sandbox Code Playgroud)

java stack-overflow

2
推荐指数
1
解决办法
1613
查看次数

如何避免Java / Kotlin / IntelliJ IDEA中的StackOverFlow错误?

我想做一个BigInteger的阶乘(在Kotlin中)。使用尾部递归时,当我尝试执行9000时会出现StackOverFlow错误。使用非递归函数,我可以做到这一点……但是我很好奇如何避免这种错误。

这是我的代码:

import java.math.BigInteger

fun tail_recursion_factorial(n: BigInteger, factorialOfN: BigInteger = BigInteger.valueOf(2)): BigInteger {
   return when(n){
        BigInteger.ONE ->  BigInteger.ONE
        BigInteger.valueOf(2) ->  factorialOfN
        else -> tail_recursion_factorial(n.minus(BigInteger.ONE), n.times(factorialOfN))
    }
}
fun non_recursive_factorial(n: BigInteger): BigInteger{
    var i: BigInteger = BigInteger.ONE
    var factorial: BigInteger = BigInteger.ONE
    while (i<=n){
        factorial = factorial.times(i)
        i = i.plus(BigInteger.ONE)
    }
    return factorial
}
fun main(args: Array<String>){
    print("n == ")
    var n = readLine()!!
    //recursive
    //println("$n! is ${tail_recursion_factorial(BigInteger(n))}")
    //non-recursive
    println("$n! is ${non_recursive_factorial(BigInteger(n))}")
}
Run Code Online (Sandbox Code Playgroud)

java recursion tail-recursion kotlin

1
推荐指数
1
解决办法
346
查看次数

使用Recursion的StackOverflowError

我应该比较一个递归函数和一个非递归函数,看看哪个类项目更快.当迭代器等于10,100,1000等时,教授还希望我们以毫秒为单位计算迭代次数.我得到了所有工作,但是在C++中获得计时器时遇到了很多麻烦,所以我切换到了Java,因为它太多了更容易获得毫秒输出.

但是现在当我尝试使用超过8,000的任何数字时,我从递归算法中得到了一个很大的堆栈溢出错误.任何人都可以给我任何见解吗?额外:我也无法弄清楚如何在递归函数中执行计时器,就像我在Non-Recursive中一样.我该如何处理?

public class comparingTimes {
    public static void main(String[] args) {

        double num = 10000;
        double result;
        nonRec(num); 
        result = rec(num);      
        System.out.printf("Rec %.0f",(result));
    }
    public static void nonRec(double num)
    {
    double resultNum = 1;
    double total = 0;
    long startTime = System.currentTimeMillis();
    long endTime;
    for (double i = 1; i < num; i++)
     {
        total += i * (i+1);
        if (i == resultNum)
        {
            endTime = System.currentTimeMillis();
            System.out.printf("Total execution time: %f seconds - num = %.0f%n", (endTime - startTime)/1000.0, …
Run Code Online (Sandbox Code Playgroud)

java recursion

0
推荐指数
1
解决办法
127
查看次数