学info的请进,(问题解决了,非常感谢大家的tips,dank e God, danke euch!)
我在用eclipse写一个关于算法的程序,算法中产生的中间值以tree 的形势和 堆栈的形势保存。根据eingabe 的不同,搜索产生的中间值的个数也不同。debug时产生 StackOverFlowException, 首先我想到的是不是有死循环,检查过了没有,其次,检查递归方法,好像也没有逻辑错误。
用一个相对简单的 eingabe 测试, 得到 1800 个中间值, 没有StackOverFlowException,能运行。
又用一个相对复杂的 eingabe 测试, 产生 StackOverFlowException,运行不能通过, debug 运行到 14000 个中间值时,产生 StackOverFlowException。
我是新手,请问,StackOverFlowException 产生有没有可能是系统分配的内存不够? 不过其实 99% 的情况应该是死循环,可是我有的eingabe是可以运行的,所有的测试的eingabe 都是同样格式的,就是int[] 和 String 值封装的对象,问题应该不是出在eingabe的值上,有不像是 算法的逻辑错误。
郁闷ing,求高人给些建议。
ok了, 问题解决了,非常抱歉暂时还不能把代码贴出来,sorry。 正象很多朋友说的那样 堆栈溢出99。9999%的问题是,在 死循环(判断条件不严谨),和 递归过深,
解决方案:
1。 死循环,那就没话说了,找出logische Fehler。
2。 关于递归过深,简单的说就是算法不够优化。解决方法:1,专业一点的方法,就得优化算法,避免过深的递归。 2,或者 偷懒的方法 -Xss 的参数加大,把VM栈深度加大。
谢谢大家。
[ 本帖最后由 @Deutschland 于 2008-9-8 21:27 编辑 ] 如果系统分配的内存不够够的话,报的不是StackOverFlowException错误。如果可以的话,可以贴一段代码出来,大家讨论一下。 这个很像是最开始的参数没有初始化,所以没预留空间,所以最后指针指到别的地方去了。 不是学info的,但是给你们加油啊。ms这个eclipse这几天也在用,但是老是不会用,哈哈 试过设个Exception breakpoint吗? 就是debug的时候,如果出现这个exception就停住的那种。。。
然后分析一下那个时候的Zwischenzustand$考虑$ 不过不知道StackOverFlow能不能抓住。。呵呵,试试吧。。
另外,如果没记错的话,Stack存object的?看看是不是instance生成的太多了。。。
ps: 假设你用的是java。。。$汗$
[ 本帖最后由 krap 于 2008-9-6 10:27 编辑 ] 我用C++的时候也出过这种问题。
我当时就是单纯的打印int[ ]出来,每次打印到1000多时,就溢出。
总而言之,这是个很简单的问题,就是和你分配空间,初始化有关。你试试其他表达方式就能看出了 不应该是程序的问题,可能是JVM的配置问题
可适当提高一下java应用程序的最大可用内存量, 将下列参数填入Eclipse--> Run--> VM arguments
-Xmx512m(最大 512M可用)
java -Xmx512m -Xms64mcom.yourfirma.classname
[ 本帖最后由 BMW-DaMi 于 2008-9-6 15:22 编辑 ] 感谢大家的tips, 我再试试, 非常感谢大家!
ps:不好意思,我作的是java , 忘说了,呵呵
[ 本帖最后由 @Deutschland 于 2008-9-6 22:15 编辑 ] 原帖由 BMW-DaMi 于 2008-9-6 15:17 发表 http://www.dolc.de/forum/images/common/back.gif
不应该是程序的问题,可能是JVM的配置问题
可适当提高一下java应用程序的最大可用内存量, 将下列参数填入Eclipse--> Run--> VM arguments
-Xmx512m(最大 512M可用)
java -Xmx512m -Xms64mcom.yourfirma.cl ...
哦, 我试过了,但还是不行,schade。唉。。。
对了,跟大家探讨一下 eclipse的功能, 以前也大概看到过eclipse中 JVM 最大可配置512M, 我试过了fogendes:
配置 512M ok
配置 1024M 时, 运行不了,break了,提示配置错误。
我又试了配置 700M ,und 900M 也ok。
我的问题是当我配置 700 和900 也就是说> 512M 时, 是不是虽然配置检查通过了,但是JVM其实并没有 达到 > 512M的效果?
请大家解答,谢谢 lZ,我觉得应该是你的算法自身的问题,出现这个问题说明你的算法不够优化,所以在复杂的eingabe的情况下,会出现几何级数的递归调用,从而造成stack overflow, 你还是看看你的自己的算法吧,比如能不能要精简的冒泡算法的替代schleifen,.....从而降低递归的调用。 原帖由 krap 于 2008-9-6 10:22 发表 http://www.dolc.de/forum/images/common/back.gif
试过设个Exception breakpoint吗? 就是debug的时候,如果出现这个exception就停住的那种。。。
然后分析一下那个时候的Zwischenzustand$考虑$ 不过不知道StackOverFlow能不能抓住。。呵呵,试试吧。。
另外,如 ...
谢谢 你啊, 我是作的java,另外请问 用stack 存object不好吗?或应该用list oder?嗯,我作的搜索算法需要产生大量的结点(objects),而且这些结点还必须保存下来,结点数量估计从2000 到30000 不等(je nachdem eingabe),用什么样的数据结构好呢? 原帖由 stella1016 于 2008-9-6 13:13 发表 http://www.dolc.de/forum/images/common/back.gif
我用C++的时候也出过这种问题。
我当时就是单纯的打印int[ ]出来,每次打印到1000多时,就溢出。
总而言之,这是个很简单的问题,就是和你分配空间,初始化有关。你试试其他表达方式就能看出了
谢谢你 stella1016 啊,
初始化问题应该不是,因为 我用不同的eingabe调用同样算法时,有的就能运行,有的就overflow,那就是说不是算法中涉及的变量初始化问题。eingabe初始化我检查了,都应该初始化化了。
分配空间的问题,嗯, 我在作的是java,java中对对象的存储结构的数据类型好像一般不太需要自己配置空间,比如 Vector List ArrayList。。。内存空间不是随着被存入的对象数量改变而改变的吗?或者我理解错了你的意思。
trodem vielen vielen dank 原帖由 iwu 于 2008-9-6 22:27 发表 http://www.dolc.de/forum/images/common/back.gif
lZ,我觉得应该是你的算法自身的问题,出现这个问题说明你的算法不够优化,所以在复杂的eingabe的情况下,会出现几何级数的递归调用,从而造成stack overflow, 你还是看看你的自己的算法吧,比如能不能要精简的冒泡算 ...
谢谢你 iwu啊,
我现在也有这个想法,正在检查我的算法呢。嗯,我作的搜索算法需要产生大量的结点(objects),而且这些结点还必须保存下来,结点数量估计从2000 到30000 不等(je nachdem eingabe),还有什么好的建议呢?
vielen vielen dank 原帖由 @Deutschland 于 2008-9-6 22:29 发表 http://www.dolc.de/forum/images/common/back.gif
谢谢 你啊, 我是作的java,另外请问 用stack 存object不好吗?或应该用list oder?嗯,我作的搜索算法需要产生大量的结点(objects),而且这些结点还必须保存下来,结点数量估计从2000 到30000 不等(je nachdem ...
hashtable 递归算法最容易产生内存溢出的问题, 多数是因为中止条件不够严谨.也许你在判断中间值的时候,出现了相同的值, 也许这样会导致死循环.
因为没有看到代码,说的这些总归是猜测. 最好能贴出代码出来,才能知道究竟问题在哪. 内存不够一般是OutOfMemory,
堆栈里面是变量的reference,溢出的话很有可能是程序的算法没有优化,
最好把代码贴出来看看 很简单 你的递归没有设好终止条件导致不断压栈 原帖由 @Deutschland 于 2008-9-6 22:29 发表 http://www.dolc.de/forum/images/common/back.gif
谢谢 你啊, 我是作的java,另外请问 用stack 存object不好吗?或应该用list oder?嗯,我作的搜索算法需要产生大量的结点(objects),而且这些结点还必须保存下来,结点数量估计从2000 到30000 不等(je nachdem ...
貌似我们两个说的不是一个stack$frage$
我猜原因是这样的。。Java运行的时候把可分配的空间分成heap和stack。。还有大概就是计算需要的空间。。
他们(heap, stack)都是存生成的instance,一个好像存static的,一个非static的。。
他们的大小是事先分配好的,如果你一直在生成instance而这些instance由于各种原因还不能被garbage collected,总有一刻这个stack就满了,再往下,就要冲到heap里去了。。当然这个是unerwuenscht,然后就会抛出stackoverflowexception。。我理解这个stack不是指你存储的形式。。而是指分配储存instance的空间。。。:)
这也就是为什么你运行简单的eingabe没有问题,当eingabe复杂的时候,算法的rekursion是以几何级数上涨的。。也就是说有可能生成了太多太多的instance。。
所以如果说前面已经试过jvm分配到最大空间也无法满足需求的话。。看看算法能不能优化。。。尽量少生成instance...$bye$
[ 本帖最后由 krap 于 2008-9-7 11:54 编辑 ] 用c++经常会碰到这样的错误,这根eclipse没啥关系。
用c++经常会用到new来才生一个instanz,但是要注意的是当你不用它的时候要把它delete掉。这是c++最大的缺陷,所以garbage的处理在c++里很重要。
很多人喜欢用java。java 就没有这样的问题,当一个object不再需要的话,自动就被清除掉。 1. java使用Garbage Collector来自动回收内存,但是你在每个节点的Collection(List, Set, Map)类中,包含了生成的Object的Reference, 这样的Objects(即使不再使用)不能自动释放, 可尝试将不用节点的Collection类,进行强制释放 , 就是程序运行期间,使用clear()方法explicit强制清空Collection类
2. 或使用Conquer and Divid 的模式来分割算法.
[ 本帖最后由 BMW-DaMi 于 2008-9-7 13:28 编辑 ] 在info板块已经回你了。估计是你算法问题,递归的层次太深了。所以stack不够用了。
大哥啊,你心急归心急,也用不着没个板块都发个帖子吧。 谢谢,大家 问题解决了! 请问,各位已工作的前辈,有人在google 工作过吗?
页:
[1]