找回密码
 注册

微信登录

微信扫一扫,快速登录

查看: 2132|回复: 22

[其它] 学info的请进,(问题解决了,非常感谢大家的tips,dank e God, danke euch!)

[复制链接]
发表于 2008-9-6 00:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册 微信登录

×
我在用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 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2008-9-6 01:29 | 显示全部楼层
如果系统分配的内存不够够的话,报的不是StackOverFlowException错误。如果可以的话,可以贴一段代码出来,大家讨论一下。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-6 09:34 | 显示全部楼层
这个很像是最开始的参数没有初始化,所以没预留空间,所以最后指针指到别的地方去了。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-6 10:03 | 显示全部楼层
不是学info的,但是给你们加油啊。ms这个eclipse这几天也在用,但是老是不会用,哈哈
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-6 10:22 | 显示全部楼层
试过设个Exception breakpoint吗? 就是debug的时候,如果出现这个exception就停住的那种。。。
然后分析一下那个时候的Zwischenzustand$考虑$ 不过不知道StackOverFlow能不能抓住。。呵呵,试试吧。。

另外,如果没记错的话,Stack存object的?看看是不是instance生成的太多了。。。

ps: 假设你用的是java。。。$汗$

[ 本帖最后由 krap 于 2008-9-6 10:27 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-6 13:13 | 显示全部楼层
我用C++的时候也出过这种问题。
我当时就是单纯的打印int[ ]出来,每次打印到1000多时,就溢出。
总而言之,这是个很简单的问题,就是和你分配空间,初始化有关。你试试其他表达方式就能看出了
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-6 15:17 | 显示全部楼层
不应该是程序的问题,可能是JVM的配置问题
可适当提高一下java应用程序的最大可用内存量, 将下列参数填入Eclipse--> Run--> VM arguments
-Xmx512m  (最大 512M可用)

java -Xmx512m -Xms64m  com.yourfirma.classname

[ 本帖最后由 BMW-DaMi 于 2008-9-6 15:22 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-6 22:13 | 显示全部楼层
感谢大家的tips, 我再试试, 非常感谢大家!

ps:不好意思,我作的是java , 忘说了,呵呵

[ 本帖最后由 @Deutschland 于 2008-9-6 22:15 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-6 22:23 | 显示全部楼层
原帖由 BMW-DaMi 于 2008-9-6 15:17 发表
不应该是程序的问题,可能是JVM的配置问题
可适当提高一下java应用程序的最大可用内存量, 将下列参数填入Eclipse--> Run--> VM arguments
-Xmx512m  (最大 512M可用)

java -Xmx512m -Xms64m  com.yourfirma.cl ...

哦, 我试过了,但还是不行,schade。唉。。。

对了,跟大家探讨一下 eclipse的功能, 以前也大概看到过eclipse中 JVM 最大可配置512M, 我试过了fogendes:
配置 512M ok
配置 1024M 时, 运行不了,break了,提示配置错误。
我又试了配置 700M ,und 900M 也ok。

我的问题是当我配置 700 和900 也就是说> 512M 时, 是不是虽然配置检查通过了,但是JVM其实并没有 达到 > 512M的效果?

请大家解答,谢谢
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-6 22:27 | 显示全部楼层
lZ,我觉得应该是你的算法自身的问题,出现这个问题说明你的算法不够优化,所以在复杂的eingabe的情况下,会出现几何级数的递归调用,从而造成stack overflow, 你还是看看你的自己的算法吧,比如能不能要精简的冒泡算法的替代schleifen,.....从而降低递归的调用。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-6 22:29 | 显示全部楼层
原帖由 krap 于 2008-9-6 10:22 发表
试过设个Exception breakpoint吗? 就是debug的时候,如果出现这个exception就停住的那种。。。
然后分析一下那个时候的Zwischenzustand$考虑$ 不过不知道StackOverFlow能不能抓住。。呵呵,试试吧。。

另外,如 ...

谢谢 你啊, 我是作的java,另外请问 用stack 存object不好吗?或应该用list oder?嗯,我作的搜索算法需要产生大量的结点(objects),而且这些结点还必须保存下来,结点数量估计从2000 到30000 不等(je nachdem eingabe),用什么样的数据结构好呢?
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-6 22:39 | 显示全部楼层
原帖由 stella1016 于 2008-9-6 13:13 发表
我用C++的时候也出过这种问题。
我当时就是单纯的打印int[ ]出来,每次打印到1000多时,就溢出。
总而言之,这是个很简单的问题,就是和你分配空间,初始化有关。你试试其他表达方式就能看出了

谢谢你 stella1016 啊,
初始化问题应该不是,因为 我用不同的eingabe调用同样算法时,有的就能运行,有的就overflow,那就是说不是算法中涉及的变量初始化问题。eingabe初始化我检查了,都应该初始化化了。
分配空间的问题,嗯, 我在作的是java,java中对对象的存储结构的数据类型好像一般不太需要自己配置空间,比如 Vector List ArrayList。。。内存空间不是随着被存入的对象数量改变而改变的吗?或者我理解错了你的意思。

trodem vielen vielen dank
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-6 22:43 | 显示全部楼层
原帖由 iwu 于 2008-9-6 22:27 发表
lZ,我觉得应该是你的算法自身的问题,出现这个问题说明你的算法不够优化,所以在复杂的eingabe的情况下,会出现几何级数的递归调用,从而造成stack overflow, 你还是看看你的自己的算法吧,比如能不能要精简的冒泡算 ...

谢谢你 iwu啊,

我现在也有这个想法,正在检查我的算法呢。嗯,我作的搜索算法需要产生大量的结点(objects),而且这些结点还必须保存下来,结点数量估计从2000 到30000 不等(je nachdem eingabe),还有什么好的建议呢?

vielen vielen dank
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-6 22:52 | 显示全部楼层
原帖由 @Deutschland 于 2008-9-6 22:29 发表

谢谢 你啊, 我是作的java,另外请问 用stack 存object不好吗?或应该用list oder?嗯,我作的搜索算法需要产生大量的结点(objects),而且这些结点还必须保存下来,结点数量估计从2000 到30000 不等(je nachdem ...



hashtable
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-6 23:21 | 显示全部楼层
递归算法最容易产生内存溢出的问题, 多数是因为中止条件不够严谨.也许你在判断中间值的时候,出现了相同的值, 也许这样会导致死循环.

因为没有看到代码,说的这些总归是猜测. 最好能贴出代码出来,才能知道究竟问题在哪.
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-6 23:46 | 显示全部楼层
内存不够一般是OutOfMemory,
堆栈里面是变量的reference,溢出的话很有可能是程序的算法没有优化,
最好把代码贴出来看看
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-7 08:44 | 显示全部楼层
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-7 11:53 | 显示全部楼层
原帖由 @Deutschland 于 2008-9-6 22:29 发表

谢谢 你啊, 我是作的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 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-7 12:54 | 显示全部楼层
用c++经常会碰到这样的错误,这根eclipse没啥关系。

用c++经常会用到new来才生一个instanz,但是要注意的是当你不用它的时候要把它delete掉。这是c++最大的缺陷,所以garbage的处理在c++里很重要。

很多人喜欢用java。java 就没有这样的问题,当一个object不再需要的话,自动就被清除掉。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-7 13:24 | 显示全部楼层
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 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

发表于 2008-9-7 13:55 | 显示全部楼层
在info板块已经回你了。估计是你算法问题,递归的层次太深了。所以stack不够用了。
大哥啊,你心急归心急,也用不着没个板块都发个帖子吧。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-8 21:30 | 显示全部楼层
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-9-8 21:31 | 显示全部楼层
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

Archiver|手机版|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网

GMT+2, 2025-5-25 04:18 , Processed in 0.099283 second(s), 32 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表