Perl在内存耗尽时是否有标准的行为方式?

时间:2012-11-06 02:52:19

标签: perl memory-management exception-handling out-of-memory

Perl解释器(也称为“perl”)在内存不足时是否有标准(ish)方式?它是以任何方式记录/推出的吗?以统一的方式编码?

我对任何表示为运行Perl代码的约定的标准特别感兴趣 - 例如,die会被调用吗?会END阻止执行吗?等...

我对两个“理论上”的答案都很好(例如某种通用的“这是perl代码应该在内存上做的事情”,来自Larry / P5P /等的任务声明文件...... ,即使没有100%的malloc()调用遵循此规则);或者“实用”语句(例如,Perl中的所有malloc()调用都包含在一个通用的“allocate_memory”函数中,该函数统一处理所有失败)。

答案可能取决于具体导致内存不足的原因(例如,请求更多内存用于Perl代码的数据结构与内部Perl代码分配的内存,与显式无关“需要存储更多数据”逻辑Perl程序)。

如果答案非常依赖于实现,则假设Solaris / Linux为perl,并且缩小到任何最近的稳定版本(5.8到5.16)是可以接受的。

问题仅限于标准的Perl解释器,但是您希望定义到预编译配置(例如,主要Linux发行版附带的perl,或者单独保留所有默认值的编译等等)

注:此问题来自Gilles对another Q的评论

1 个答案:

答案 0 :(得分:6)

看一下Perl在启用“使用诊断”编译指示时会发出的manual page for the various diagnostic warnings,您可以看到各种不同类型的“内存不足”错误及其含义。

因此,您可以从这些消息中推断出“标准”行为;带有感叹号的那个(“内存不足!”)听起来就像你要问的那个:

Out of memory!
(X) The malloc() function returned 0, indicating there was
insufficient remaining memory (or virtual memory) to satisfy the
request.  Perl has no option but to exit immediately.

“X”级别错误标记为“非常致命的错误(不可匹配)。”

然而,如果它是一个“大请求”(大于64K)它是可捕获的(我猜Perl假设它有足够的内存来干净地关闭)。