我遇到了一个本地机器人竞赛的生产者-消费者设置问题(想想Scalatron,但允许使用更多语言,并使用管道将其与stdin和stdout连接)。这些项目制作得很好,并由使用者正确处理,但是,使用者在此设置中的任务是调用可能占用过多内存的其他软件,从而导致内存不足错误。
我有一个Python脚本(即使用者)使用连续调用其他代码subprocess.call
。这些都是由其他人提交以进行评估的,但是,有时这些提交的片段之一使用了如此多的内存,引擎会产生OutOfMemoryError,这会导致整个脚本暂停。
使用的设置中包含三层:
使用者使用两个漫游器作为参数来调用游戏引擎:
subprocess.call(['setsid', 'sudo', '-nu', 'botrunner', '/opt/bots/sh/run_bots.sh', bot1, bot2])
。
在游戏引擎内部,有一个循环使机器人相互抵制,然后将所有数据保存在数据库中,以便玩家可以查看自己的机器人。这个想法是,如果机器人造成错误,则记录错误并将胜利发给对手。
但是,什么地方最适合抓住这个呢?应该在“最高”(即消费者)级别还是在游戏引擎本身中完成?
捕获JavaException
或Error
Java的正确地方是您拥有一种机制来处理它们并执行一些恢复步骤的地方。对于OutOfMemoryError
,只有在能够正常关闭错误,干净地释放资源并记录故障原因(如果可能)的情况下,才应捕获该错误。
OutOfMemoryError
发生这种情况的原因是块内存分配无法用堆的剩余资源满足。无论何时OutOfMemoryError
抛出,堆都会在尝试分配失败之前包含完全相同数量的分配对象。这应该是当你要实际时间catch
的OutOfMemoryError
,并试图下降到运行时引用的对象以释放可能需要进行清理甚至更多的内存。
如果JVM处于可修复状态(您永远无法通过程序确定它的状态),则甚至有可能从错误中恢复并继续。但这通常被认为是不好的设计,因为我说过您永远无法通过程序确定它。
如果你看到文档的java.lang.Error
,它说
错误是Throwable的子类,它指示合理的应用程序不应尝试捕获的严重问题。
如果您故意捕获任何错误,请记住不要覆盖catch(Throwable t) {...}
代码中的所有地方。
更多细节在这里。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句