Java eclipse中的堆和堆栈
我已经在Eclipse中编写了一个代码,它可以针对较小的输入值正常运行,但是一旦我的测试用例的大小增加,我就会得到Java eclipse中的堆和堆栈,java,eclipse,heap,stack-overflow,out-of-memory,Java,Eclipse,Heap,Stack Overflow,Out Of Memory,我已经在Eclipse中编写了一个代码,它可以针对较小的输入值正常运行,但是一旦我的测试用例的大小增加,我就会得到OutOfMemoryException或StackOverFlow错误 我试图使用eclipse.exe-vmargs-Xmx1g使我的堆变为1G,但仍然得到相同的错误。当我尝试2G时,它说无法启动JVM 所以我想知道是否有任何方法可以让我运行这段代码。任何帮助都将不胜感激。提前谢谢 编辑: 这就是我堆积如山的地方。输入样本太大,导致记忆问题 while ((line = br.
OutOfMemoryException
或StackOverFlow
错误
我试图使用eclipse.exe-vmargs-Xmx1g
使我的堆变为1G,但仍然得到相同的错误。当我尝试2G时,它说无法启动JVM
所以我想知道是否有任何方法可以让我运行这段代码。任何帮助都将不胜感激。提前谢谢
编辑:
这就是我堆积如山的地方。输入样本太大,导致记忆问题
while ((line = br.readLine()) != null) {
String[] linevalue= (line.trim().split("\\s+"));
int l= linevalue.length;
dg.addNode(Long.parseLong(linevalue[0]));
dg.addNode(Long.parseLong(linevalue[1]));
dg.addEdge(Long.parseLong(linevalue[0]), Long.parseLong(linevalue[1]));
}
在另一个类中存在以下代码,这里mGraph是一个HashMap
public boolean addNode(T node) {
/* If the node already exists, don't do anything. */
if (mGraph.containsKey(node))
return false;
/* Otherwise, add the node with an empty set of outgoing edges. */
mGraph.put(node, new HashSet<T>());
return true;
}
public void addEdge(T start, T dest) {
/* Confirm both endpoints exist. */
if (!mGraph.containsKey(start) || !mGraph.containsKey(dest))
throw new NoSuchElementException("Both nodes must be in the graph.");
/* Add the edge. */
mGraph.get(start).add(dest);
}
public boolean addNode(T节点){
/*如果节点已经存在,则不执行任何操作*/
if(经理容器(节点))
返回false;
/*否则,添加具有一组空的传出边的节点*/
mGraph.put(节点,新HashSet());
返回true;
}
公共无效添加(T开始,T结束){
/*确认两个端点都存在*/
如果(!管理层容器(开始)| |!管理层容器(目的))
抛出新的NoSuchElementException(“两个节点都必须在图中”);
/*添加边*/
经理获取(开始)、添加(目的);
}
在Eclipse中,您可以在执行代码时设置VM的大小
转到运行>运行配置
。然后在选项卡Arguments
中,将-Xms1000m
放在VM Arguments下。跟进tskuzzy的:
对于堆
-Xms -Xmx
用于堆栈
-Xss
我建议
1g
用于Xmx
和Xmx
,而8m
用于-Xss
也许通过发布代码我们可以帮助您?更好的是,发布一个SSCCE这是一个开始,但我看不出代码中有任何真正的问题。也许在addEdge或addNode中,有一个快速爆发的递归?您可能应该公开整个类。为了更好地理解,您进行了更多的编辑。我希望这会有所帮助。您可以尝试使用-Xss选项增加堆栈大小,但一般来说,Guillaume Polet是正确的——如果代码中没有不受控制的递归,很难耗尽堆栈。如果您的测试行非常长,有很多空格,那么它也可能是split()。上面给出的代码就是我得到堆错误的地方。在这之后,我执行了一些递归DFS,在这里我得到了一个stackoverflow错误。如果我需要为同一次运行增加堆栈,我该如何实现呢?这个问题已经在这里解决了:tldr:你不能。您受到初始VM大小的限制。不,我实际上的意思是,我尝试了您为堆大小编写的代码,它对我有效,但对于进一步的递归调用,我的堆栈似乎不够。所以我的问题是,我可以同时为eclipse中的VM设置堆栈大小和堆大小吗?类似于-Xms1000m,-Xss256m之类的东西。我把参数放在VM配置中作为-Xms1000m-Xss64m,它就工作了。谢谢