尝试设置数组元素时出现“java.lang.OutOfMemoryError:Java堆空间”

时间:2011-12-16 06:29:46

标签: java out-of-memory

这是我用于Google的antai挑战的一大堆代码,无论何时我运行它似乎进入一些无限循环然后我得到底部的堆栈跟踪。我很难看到这段代码我不能为我的生活弄明白这一点。

public class Node 
{
    private final int xCoord, yCoord;
    private int F, G, H;
    private Tile location;
    Node previousNode;
    private Tile [] neighbors;

    /*  
    G 
    the exact cost to reach this node from the starting node.
    H 
    the estimated(heuristic) cost to reach the destination from here.
    F = G + H 
    As the algorithm runs the F value of a node tells us how expensive we think it will         be to reach our goal by way of that node.
    */

    public Node(Tile loc)
    {
        location = loc;
        xCoord = location.getCol();
        yCoord = location.getRow();
        F=G=H=0;
        setNeighbors();
    }

    private void setNeighbors()
    {
        if(neighbors == null)
        {
            neighbors = new Tile[4];
        }
        neighbors[0] = new Tile(xCoord+1,yCoord);
        neighbors[1] = new Tile(xCoord-1,yCoord);
        neighbors[2] = new Tile(xCoord,yCoord+1);
        neighbors[3] = new Tile(xCoord,yCoord-1);//error occurs here!!!!!!
    }
}

        /**
 * Represents a tile of the game map.
 */
public class Tile implements Comparable<Tile> {
    private final int row;

    private final int col;

    /**
     * Creates new {@link Tile} object.
     * 
     * @param row row index
     * @param col column index
     */
    public Tile(int row, int col) {
        this.row = row;
        this.col = col;
    }

    /**
     * Returns row index.
     * 
     * @return row index
     */
    public int getRow() {
        return row;
    }

    /**
     * Returns column index.
     * 
     * @return column index
     */
    public int getCol() {
        return col;
    }

    /** 
     * {@inheritDoc}
     */
    @Override
    public int compareTo(Tile o) {
        return hashCode() - o.hashCode();
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public int hashCode() {
        return row * Ants.MAX_MAP_SIZE + col;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean equals(Object o) {
        boolean result = false;
        if (o instanceof Tile) {
            Tile tile = (Tile)o;
            result = row == tile.row && col == tile.col;
        }
        return result;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public String toString() {
        return row + " " + col;
    }
    }

我收到的实际错误是:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at Node.setNeighbors(Node.java:37)
    at Node.<init>(Node.java:25)
    at AstarSearch.assessRoute(AstarSearch.java:73)
    at MyBot.gatherFood(MyBot.java:153)
    at MyBot.doTurn(MyBot.java:124)
    at AbstractSystemInputParser.processLine(AbstractSystemInputParser.java:54)
    at AbstractSystemInputReader.readSystemInput(AbstractSystemInputReader.java:18)
    at MyBot.main(MyBot.java:25)

感谢任何帮助

5 个答案:

答案 0 :(得分:3)

您需要进行一些调试/清理。从快速查看,我看到,在assesRoute()你 永远不会操纵interesetedNode tile - 这个循环不会正常结束。

将访问过的节点保留在哈希集中也更好 - 您只需要确保是否存在,而不是确保多个节点。替代方案是节点本身的布尔标志,这样你就可以使用一个列表。

答案 1 :(得分:2)

似乎你创建的内容比你的内存允许的更多,猜测你的代码包含一个unifite循环,你可以创建一个静态整数来计算setNeighbors被调用的次数,它是你创建新对象的例程,以及在类的主调用周围的try / catch的catch语句中显示此整数。

答案 2 :(得分:1)

我不知道这个Google的挑战是什么,所以这可能没用多少(即我不知道你是否有权访问JVM),尽管这是一种帮助诊断这种类型的通用方法问题

我建议打开JVM标志-XX:+HeapDumpOnOutOfMemoryError,然后再次运行代码。 OutOfMemoryError将导致堆转储。然后,您可以使用Eclipse MAT等内容离线分析此内容。

答案 3 :(得分:0)

堆栈跟踪中的MyBot.doTurn()表明你的程序正在运行或发现某种路径......你确定这是一个有限的算法吗?

答案 4 :(得分:0)

assesRoute中的

是一个while循环。你期望多少次迭代?打印出实际完成的数量。如果差异很大,你知道存在问题。获取此迭代的开始状态,并尝试理解为什么此状态不会在适当的时间结束循环。