如何解决OutOfMemoryError:Java堆空间在遍历时用巨大的图查找所有可能的路径?

如何解决OutOfMemoryError:Java堆空间在遍历时用巨大的图查找所有可能的路径?,java,recursion,data-structures,out-of-memory,graph-traversal,Java,Recursion,Data Structures,Out Of Memory,Graph Traversal,我正在实现一个图遍历来查找所有可能的路径,它可以很好地处理一个小样本图。但是当我把它放到一个更大的图(有1000个顶点)上时,程序会崩溃,并出现OutOfMemoryError:Java堆空间。错误发生在str+=src+“->”在第13行 有没有更好的解决办法?谢谢 这是遍历的代码 private void displayPathRec( String src, String dest, String str ) { DSALinkedList ll = null; DSAGr

我正在实现一个图遍历来查找所有可能的路径,它可以很好地处理一个小样本图。但是当我把它放到一个更大的图(有1000个顶点)上时,程序会崩溃,并出现OutOfMemoryError:Java堆空间。错误发生在
str+=src+“->”在第13行

有没有更好的解决办法?谢谢

这是遍历的代码

private void displayPathRec( String src, String dest, String str )
{
    DSALinkedList ll = null;
    DSAGraphVertex v = null;

    ll = getAdjacent( src );
    Iterator iter = ll.iterator();

    // Base Case: found endLabel
    if( !src.equals( dest ) )
    {
        str += src + " -> ";
        while( iter.hasNext() )
        {
            v = (DSAGraphVertex) iter.next();
            displayPathRec( v.getLabel(), dest, str );
        }
    }
    else
        System.out.println(str + dest);
}
我的图表样本

    graph.addVertex("A", 25);
    graph.addVertex("B", 60);
    graph.addVertex("C", 45);
    graph.addVertex("D", 75);
    graph.addVertex("E", 95);
    graph.addVertex("F", 85);
    graph.addVertex("T", 115);
    graph.addVertex("G", 105);

    graph.addEdge("A", "B", "AB", "");
    graph.addEdge("A", "D", "AD", "");
    graph.addEdge("A", "C", "AC", "");
    graph.addEdge("A", "E", "AE", "");
    graph.addEdge("B", "E", "BE", "");
    graph.addEdge("E", "F", "EF", "");
    graph.addEdge("E", "G", "EG", "");
    graph.addEdge("D", "C", "DC", "");
    graph.addEdge("D", "F", "DF", "");
    graph.addEdge("F", "T", "FT", "");
    graph.addEdge("F", "G", "FG", "");
    graph.addEdge("T", "G", "TG", "");
    graph.addEdge("C", "F", "CF", ""); 

    DSALinkedList adjList = null;
    DSAGraphVertex v = null;
    String src = "A", dest = "G";

    graph.displayPath( src, dest );
输出

A -> B -> E -> F -> T -> G
A -> B -> E -> F -> G
A -> B -> E -> G
A -> D -> C -> F -> T -> G
A -> D -> C -> F -> G
A -> D -> F -> T -> G
A -> D -> F -> G
A -> C -> F -> T -> G
A -> C -> F -> G
A -> E -> F -> T -> G
A -> E -> F -> G
A -> E -> G
这是一个工作示例,但当我尝试将其用于较大的图形时,程序崩溃

这是我的GetNextant,给定顶点的标签,它将返回顶点的邻接列表

public DSALinkedList getAdjacent( String inLabel )
{
    DSAGraphVertex v = null;

    if( !hasVertex(inLabel) )                       // If inLabel does not exists means vertex is not exists
        throw new IllegalArgumentException("Label does not exist");

    else
    {
        boolean found = false;
        
        Iterator iter = vertices.iterator();        // Iterate through vertices becase we want to get
                                                    // link list of vertex and link list is fields of vertex
        // ASSERTION: Iterate over vertices (to search for the desired vertex)
        while( iter.hasNext() && !found )
        {
            v = (DSAGraphVertex)iter.next();
            found = v.getLabel().equals(inLabel);
        }
    }
    return v.getAdjacent();  // Return vertex list
}

这在递归逻辑中不是一个问题,否则会出现stackoverflow异常而不是完整堆。听起来像是在循环中遍历图的相同节点


如果看不到数据集和整个逻辑,就很难理解问题,但是尝试执行检查以避免在漫游过程中出现循环(如果某个节点已被访问,请停止),并查看这是否解决了问题。

在收集大量html作为字符串时,我也面临这种问题。我认为应该使用StringBuilder类而不是String,因为每次添加String时都会创建一个新对象


如果您的代码在生产/测试环境中(不是在本地)中断,那么您应该检查服务器的内存和CPU分配,以及使用哪种垃圾收集器。(我用的是G1GC)。

你知道一个顶点有1000个边界的可能性有多少吗?尝试回答这个问题并重新思考您的应用程序。

这些类在哪里:DSALinkedList、DSAGraphVertex?getNexture(..)方法做什么?您可以发布一个功能完整的示例吗?DSALinkedList相当于java中的。DSAGraphVertex表示每个顶点的顶点。请参考我更新的问题,了解GetNextant方法将做什么