スレッドに関するもう 1 つの一般的な問題は、メモリの割り当てに関するものです。新しい Java スレッドが割り当てられると、スレッドのスタック用に一定のサイズのメモリが必要になります。このスレッドスタックの容量はパラメーター(Sun™ JVM の -Xss オプション)で指定され、デフォルトは約 512KB です。これにより、1,000 個のスレッドがある場合、そのスレッドスタックだけで 500MB のメモリが必要になります。このメモリは、JVM で実行されている他のすべてのメモリ割り当て(LiveCycle による割り当てなど)と競合し、メモリの割り当てに関する問題を引き起こします。
実際には、JVM でメモリの割り当てやスレッドの作成ができない場合、呼び出し元に対して OutOfMemory 例外が返されます。この例外には、スタックトレースおよび例外が発生した理由も同時に示されます。この情報は非常に重要で、原因を特定するための詳細な手がかりとなります。
2 つのエラーとそれらに関連付けられた理由コードを表示するメッセージの例を次に示します。
"unable to create new native thread: java.lang.OutOfMemoryError: unable to create new native thread java.lang.OutOfMemoryError: Java heap space"
これらのエラーは、次のいずれかの理由により、JVM でそれ以上スレッドを作成できなかったことを示しています。
プロセスごとのスレッドの制限に達した。
スレッドスタックを割り当てることができない。
正確な原因を特定するには、スレッドダンプ(「Java ダンプ」とも呼ばれる)を取得する必要があります。通常、スレッドダンプは javacore.xxxx.txt という名前で、アプリケーションサーバーのログディレクトリにあります。スレッドダンプ内には多くの情報が含まれていますが、リストの TID: トークン数を数えることで、スレッドの数をすばやく特定できます。一般的なエントリの例を次に示します。
"Thread-1227" (TID:0x106948F0, sys_thread_t:0x78996DA0, state:R, native ID:0x191C) prio=5
4XESTACKTRACE at java.net.SocketInputStream.socketRead0(Native Method)
4XESTACKTRACE at java.net.SocketInputStream.read(SocketInputStream.java(Compiled Code))
4XESTACKTRACE at java.io.BufferedInputStream.fill(BufferedInputStream.java(Compiled Code))
4XESTACKTRACE at java.io.BufferedInputStream.read1(BufferedInputStream.java(Compiled Code))
4XESTACKTRACE at java.io.BufferedInputStream.read(BufferedInputStream.java(Compiled Code))
4XESTACKTRACE at com.sun.jndi.ldap.Connection.run(Connection.java(Compiled Code))
4XESTACKTRACE at java.lang.Thread.run(Thread.java:567)
スレッドが数千個ある場合、スレッドが不足している可能性が高くなります。明らかな問題がある場合は、開発者がそれらのスレッドのスタックトレースを調べることで原因を特定できます。
注意: スレッドダンプの取得は一般には煩わしい作業で、アプリケーションサーバーを後で再起動する必要があります。
スレッド数が数百個の範囲内である場合は、java.lang.OutOfMemory エラーの原因はスレッドの制限ではありません。スレッドスタックのサイズ(前述の -Xss オプション)を小さくして LiveCycle を再実行し、問題が解消されるかどうかを確認してください。
OutOfMemoryError: Java heap space エラー
LiveCycle では、デフォルトのアプリケーションサーバーのトランザクションタイムアウト値より長いトランザクションが必要になる場合があります。例えば、サイズの大きい PDF ドキュメントの処理には、かなり時間がかかることがあります。Workbench ユーザーが、サイズの大きいファイルを Resources ビューにドラッグした場合に、アプリケーションサーバーログに上記のエラーが表示されることがあります。
アプリケーションサーバーログに OutOfMemoryError メッセージが表示された場合は、トランザクションタイムアウト値を増やす必要があります。推奨値は 300 秒(5 分)です。WebLogic では、タイムアウト値を WebLogic Server Administration Console による「Job Source」の設定値より大きくする必要があります。WebSphere では、タイムアウト値は最大トランザクションタイムアウトに設定した値より大きくする必要があります。