Perl解释器(也就是“perl”)在内存耗尽时是否有标准(ish)方式?它是以任何方式记录/推出的吗?以统一的方式编码?
我对任何表示为运行Perl代码的约定的标准特别感兴趣 – 例如,将被称为? END块会被执行吗?等等…
我对两个“理论上”的答案都很好(例如,某些通用的“这是perl代码应该在内存中执行的内容”来自Larry / P5P /等的任务声明文件……,即使不是100%的malloc()调用遵循这个规则);或者“实用”语句(例如,Perl中的所有malloc()调用都包含在一个通用的“allocate_memory”函数中,该函数统一处理所有失败).
答案可能取决于具体导致内存不足的原因(例如,对Perl代码的数据结构请求更多内存与内部Perl代码分配的内存,与显式“需要在Perl程序中存储更多数据”逻辑无关) .
如果答案非常依赖于实现,则假设Solaris / Linux为perl,并且缩小到任何最近的稳定版本(5.8到5.16)是可以接受的.
问题仅限于标准Perl解释器,但是您希望定义到预编译配置(例如,主要Linux发行版附带的perl,或者单独保留所有默认值的编译等).
解决方法
看一下在启用“使用诊断”编译指示时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.
但是如果它是一个“大请求”(大于64K)它是可捕获的(我猜Perl假设它有足够的内存来干净地关闭).