PostgreSQL の手続き型言語である pl/java の問題をデバッグしようとしています。このスタックを Linux サーバーで実行しています。
基本的に、各 Postgres バックエンド (接続プロセス) は、JNI を使用して独自の JVM を開始する必要があります。これは一般的に pl/java の主要な制限ですが、特に厄介な症状が 1 つあります。
ネイティブ メモリが不足した場合 (これは実際には malloc() が NULL を返すためではないかもしれませんが、効果はほぼ同じです)、この失敗の処理はかなり不十分です。「ネイティブ メモリの枯渇」により、OutOfMemoryError が発生します。これにより、libjvm.so 内から発信された Postgres バックエンドのセグメンテーション違反が発生し、次のような javacore ファイルが生成されます。
0SECTION TITLE subcomponent dump routine
NULL ===============================
1TISIGINFO Dump Event "systhrow" (00040000) Detail "java/lang/OutOfMemoryError" "Failed to create a thread: retVal -1073741830, errno 11" received
1TIDATETIME Date: 2012/09/13 at 16:36:01
1TIFILENAME Javacore filename: /var/lib/PostgreSQL/9.1/data/javacore.20120913.104611.24742.0002.txt
***SNIP***
さて、ここで説明されているように、Java に関するこれらのタイプの問題を改善するための合理的に明確に定義された方法があります。
http://www.ibm.com/developerworks/java/library/j-nativememory-linux/
最大ヒープ サイズをデフォルトよりもはるかに小さい値に設定できれば、特に効果があると思います。通常、次の行に沿って何かを行うことができます。
ヒープのサイズは、-Xmx および -Xms オプションを使用して Java コマンド ラインから制御されます (mx はヒープの最大サイズ、ms は初期サイズです)。論理ヒープ (アクティブに使用されるメモリの領域) は、ヒープ上のオブジェクトの数と GC に費やされた時間に応じて拡大および縮小できますが、使用されるネイティブ メモリの量は一定のままであり、- Xmx 値: 最大ヒープ サイズ。ほとんどの GC アルゴリズムは、メモリの連続したスラブとして割り当てられるヒープに依存しているため、ヒープを拡張する必要がある場合にネイティブ メモリをさらに割り当てることは不可能です。すべてのヒープ メモリは事前に予約する必要があります。
ただし、pl/java の JNI 初期化がより小さなヒープで JVM を初期化するように、これらの手順をどのように実行できるかは明らかではありません。これらのコマンド ライン引数を Postgres にうまく渡すことができません。それで、私の質問は、どうすれば最大ヒープサイズを設定したり、このコンテキストでこれらの問題を具体的に制御したりできるでしょうか? これは pl/java の一般的な問題のようです。そのため、最終的に到達した解決策を Postgres コミュニティと共有できることを期待しています。
私は JVM 内部の経験がなく、一般的に Java に精通していないことに注意してください。
ありがとう