6

Perlインタプリタ(別名「perl」)がメモリ不足のときに動作するための標準的な方法はありますか?それは何らかの形で文書化/特定されていますか?統一された方法でコーディングされていますか?

私は、実行されているPerlコードの契約として表現されている標準に特に興味があります-たとえば、die呼び出されますか?ENDブロックは実行されますか?等...

私は両方の「理論的」な答えで大丈夫です(たとえば、Larry / P5P/etcからのある種の一般的な「これはperlコードがメモリ不足で一般的に行うべきことです」ミッションステートメントドキュメント... malloc()呼び出しの100%がこのルールに従うわけではありません); または「実用的な」ステートメント(たとえば、Perlでのすべてのmalloc()呼び出しは、すべての失敗を均一に処理する汎用の「allocate_memory」関数にラップされます)。

答えは、具体的にメモリ不足の原因に依存する可能性があります(たとえば、Perlコードのデータ構造に対するより多くのメモリの要求と、Perlプログラムの明示的な「より多くのデータを格納する必要がある」ロジックに関係のない内部Perlコードによって割り当てられたメモリ) 。

答えが実装に大きく依存する場合は、Solaris / Linuxのperlを想定し、最近の安定バージョン(5.8から5.16)に絞り込むことができます。

質問は標準のPerlインタープリターに限定されていますが、コンパイル前の構成(たとえば、主要なLinuxディストリビューションに付属するperl、またはすべてのデフォルトをそのままにしてコンパイルされたperlなど)まで定義したいと思います。

注:この質問は、別のQに対するGillesのコメントから出てきました。

4

1 に答える 1

6

「診断の使用」プラグマが有効になっている場合にPerlが発行するさまざまな診断警告のマニュアルページを見ると、さまざまな種類の「メモリ不足」エラーとその意味を確認できます。

したがって、これらのメッセージから「標準」の動作を推測できます。感嘆符(「メモリ不足!」)のあるものは、あなたが質問しているもののように聞こえます。

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は、正常にシャットダウンするのに十分なメモリがあると想定しています)。

于 2012-11-06T04:07:47.853 に答える