perl - perl 在内存不足时是否有标准的行为方式?

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

Perl 解释器(又名“perl”)在内存不足时是否有标准的(ish)方式来表现?它是否以任何方式记录/说明?以某种统一的方式编码?

我对任何表达为运行 Perl 代码的契约的标准特别感兴趣——例如,will die叫做?威尔END块被执行?等等...

我对两个“理论”答案都满意(例如,来自 Larry/P5P/etc 的某种通用“这是 perl 代码在内存不足时通常应该做的事情”任务声明文档......,即使并非 100% 的 malloc() 调用都遵循此规则);或“实用”语句(例如,Perl 中的所有 malloc() 调用都包装到通用的“allocate_memory”函数中,该函数统一处理所有故障)。

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

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

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

注意:这个问题来自 Gilles 对 another Q 的评论

最佳答案

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

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

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 假设它有足够的内存来干净地关闭)。

关于perl - perl 在内存不足时是否有标准的行为方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13243637/

相关文章:

objective-c - 异常处理帮助 Xcode 4.6

c# - 为什么在 C# 中使用 finally?

正则表达式(PCRE 或 Emacs): Repetition of previously defined group

在 solaris 10 sparc 上将 perl 编译为 64 位

c++ - 我应该将所有对 new/delete 的调用集中到一个类中吗?

c++ - memcpy 可以重新分配缓冲区吗?

mysql - Perl - 如何将数据库中的 ' 解码或替换为单引号以供浏览器显示

c - 为什么即使没有控制终端,getlogin() 也会成功

C++ 堆碎片分配错误?

python - 处理除一个异常外的所有异常