IBM Support

Lotus Notes/Domino における Java 実行環境とその問題判別について

技術情報(FAQs)


質問

Lotus Notes/Domino で使用されている Java Virtual Machine(以下、JVM)や Java ランタイム環境(以下、JRE)の詳細とトラブルシューティング手法について教えて下さい。

回答

1. Lotus Notes/Domino で使用されている JVM/JRE について
Lotus Notes/Domino では IBM 製の JVM 環境を製品に同梱しており、プログラムディレクトリにある jvm ディレクトリに格納されています。主なコンポーネントは以下の通りです。

◆ JVM 環境
Lotus Notes/Domino 6.x では JVM 1.3.1(2003/03/29)、Lotus Notes/Domino 7.x では JVM 1.4.2(2004/06/26)、8.x では JVM 1.5.0、8.5 では JVM 1.6.0 が使用されています。詳細なバージョンについては以下の一覧をご参照下さい。

Lotus Notes/Domino のバージョンとJVM バージョンの一覧

Lotus Notes/Domino 6.x : JVM 1.3.1

Lotus Notes/Domino 7.0 - 7.0.1 : JVM 1.4.2
Lotus Notes/Domino 7.0.2 - 7.0.3 : JVM 1.4.2 (SR8)
Lotus Notes/Domino 7.0.4 : JVM 1.4.2 (SR11)

Lotus Notes/Domino 8.0 : JVM 1.5.0 (SR4)
Lotus Notes/Domino 8.0.1 以降 : JVM 1.5.0 (SR6b)

Lotus Notes/Domino 8.5 : JVM 1.6.0 (SR1)
Lotus Notes/Domino 8.5.1 : JVM 1.6.0 (SR4)
Lotus Notes/Domino 8.5.2 以降 : JVM 1.6.0 (SR7)

◆ JavaCompilerTarget について
Lotus Notes/Domino 8.0.x では JVM 1.5.0 (2007/04/23) が使用されますが、デフォルトでは下位互換性維持のために Java エージェントは Java 1.2 用にコンパイルされます。これはコンパイルオプションで "-source 1.3 -target 1.2" を指定した場合と等価です。
Java5 の機能を有効化するには、コンパイルを行う Lotus Notes クライアントまたは Lotus Domino サーバーに以下の Notes.ini パラメータを追加し、再起動を行ってください。Lotus Notes/Domino 8.0.x では有効な値は 1.5 のみです。

JavaCompilerTarget = 1.5

Lotus Domino 8.5 では、Java6 を使用しているため、1.1 - 1.6 の値を使用することが出来ます(これ以外の値を使用した場合はデフォルトの 1.2 が使用されます)。
また、JavaCompilerTarget=CurrentJavaVersion を指定することによって、現在使用することができる最も新しい Java バージョンでコンパイルを行うことができるようになります。
8.5 における JavaCompilerTarget の値とコンパイルオプションについては、以下の表をご参照下さい。

JavaCompilterTarget の値とコンパイルオプション

JavaCompilerTargetの値
コンパイルオプション
互換性のあるバージョン
1.1
-source 1.3 -target 1.1
Lotus Notes/Domino R5.0 以降
1.2
-source 1.3 -target 1.2
Lotus Notes/Domino 6.0 以降
1.3
-source 1.3 -target 1.3
Lotus Notes/Domino 6.0 以降
1.4
-source 1.4 -target 1.4
Lotus Notes/Domino 7.0 以降
1.5
-source 1.5 -target 1.5
Lotus Notes/Domino 8.0 以降
1.6
-source 1.6 -target 1.6
Lotus Notes/Domino 8.5 以降
CurrentJavaVersion
-source 1.6 -target 1.6
Lotus Notes/Domino 8.5 以降

◆ SDK
Java アプリケーションを作成するために必要なコンパイラーやユーティリティです。
主に Lotus Domino Designer などの IDE 環境で開発する際のコンパイラーとして使用されます。

JVM や JRE というとき、その実体はプロセスや実行ファイル、プログラムのことを指すわけではありません。通常は Java の実行を行う共有ライブラリを指します。したがって、JVM はその共有ライブラリを展開するために何らかのプロセス上で実行される必要があります。


2. Lotus Notes Java クラスについて

Lotus Notes/Domino では前述したビルトインの Java 実行環境を使用します。Lotus Notes のネイティブのオブジェクトにアクセスする際は Class Loader を使用してクラスファイルを読み込みます。ここで読み込まれたクラスはエージェントや Java アプリケーションの実行終了後にはアンロードされます。あらかじめ JVM の起動時に読み込むクラスを指定するときには Notes.ini ファイルの JavaUserClasses にファイルパスを指定することができます。これは CLASSPATH 変数と同等の動作を行います。このとき、Java クラスは Lotus Software Extension For Backend(LSXBE)用のモジュールを介して Lotus Notes/Domino のオブジェクトにアクセスするため、Lotus Notes Java クラスでは LotusScript のバックエンドオブジェクトとほぼ同等のクラスが使用されています(図1)。

このようなアクセスを行うため、Lotus Notes Java クラスを使用している際にも Lotus Notes のオブジェクトによるメモリ消費は JVM ヒープではなく、主にLotus Notes/Domino のネイティブのメモリオブジェクト(DPOOL のようなメモリダンプ上に現れるメモリブロック)のメモリ使用量に反映されます。JVM ヒープの利用状況が高い状況は、主に Lotus Notes/Domino 以外のクラスファイルなどを多く読み込んでいるときに発生します。

Lotus Notes Java クラスでは Lotus Notes/Domino の JVM 環境と同じバージョンでの実行をサポートしています。したがって、リモート接続のアプリケーションなどで止むを得ず異なるバージョンでの JVM 環境で実行する場合には、十分な注意を払って実行する必要があります。

図1. Lotus Notes Java クラスにおけるオブジェクトアクセスについて
図1. Lotus Notes Java クラスにおけるオブジェクトアクセスについて


3. HTTP タスク上での利用時における考慮事項

HTTP で JVM が利用される最も典型的なケースは、Java アクセスを行う Web エージェントが実行されたときです。このとき、Web エージェントの実行スレッドは子スレッドを生成して Java 実行に特化した処理をそのスレッド内で実行します。したがって、同時に実行される Web エージェントが多い環境では、サーバー文書の [インターネット] - [HTTP] タブにある「アクティブスレッド数」で指定されたスレッド数より多くのアクティブスレッドが稼動する可能性があります。

このようなスレッド生成の状況を調査するには Notes.ini パラメータに DebugShowJavaAgentTID=1 を指定しておく必要があります。この Notes.ini パラメータを指定する事によって、Java 用のスレッドが生成されたときに以下のようなコンソール出力を得ることができます。

コンソール出力例:
[0790:0017-0A8C] 05/18/2006 05:32:36 PM HTTP JVM: Thread 2700 (0xa8c) running agent HRInfo at the behest of HTTP thread 2232 (0x8b8)

Web エージェントの同時実行はデフォルトでは無効にされていますが、サーバー文書の [インターネット] - [Domino Web Engine] タブにある「Web エージェントを同時に実行」フィールドを有効にすることによって同時実行を許可することが可能です。ここで Web エージェントを同時に実行する場合には、使用する Java エージェントがマルチスレッドセーフであることを十分に確認した上で稼動して下さい。また複数のスレッドで実行される場合、JVM ヒープは共有されることになるため、デフォルトの 64MB では足りなくなる可能性があります。このようなときには、Notes.ini パラメータに JAVAMAXHEAPSIZE = (JVM ヒープの最大サイズ) という形式で指定して下さい。ただしこの設定によりLotus Domino の他のプロセスで使用できるメモリ量が減ることになるため、ここでの指定は MB 単位で行って下さい。ここでヒープサイズを拡張する際には 256(256MB)を超えないようにして下さい。


4. Java アプリケーションでの考慮事項と Recycle() について

JVM ではガベージコレクションが不要になったオブジェクトを定期的に解放するため、通常 Java アプリケーションの開発者は使用しているオブジェクトのメモリ管理について考慮する必要がありません。しかしながら、Lotus Notes における Java API では Lotus Notes のオブジェクトを生成する際に Lotus Notes のメモリ管理下に置かれるオブジェクトも生成されるため、このようなネイティブのオブジェクトを明示的に解放するために定期的に Recycle() メソッドの実行が必要になる事があります。これらのオブジェクトはエージェント実行終了後、Lotus Notes 用のクラスローダーがアンロードされたタイミングで解放されますが、エージェント実行時には解放されないままになります。

Recycle() の挿入を行うに当たっては以下のようなガイドラインを参考にして下さい。

1) Recycle() が必要でないケース

通常以下のようなメソッドを使用している場合、生成されたオブジェクトのバックエンドオブジェクトを解放するのに Recycle() は必要ありません。

– getCurrentAgent
– getCurrentDatabase
– getSession
– getAgentContext

コード例 (1)
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
(Your code goes here)
Database db = agentContext.getCurrentDatabase();
DocumentCollection dc = db.getAllDocuments();
Document doc = dc.getFirstDocument(); // dc や doc はRecycle() が必要

2) Recycle() を実行しないといけないケース

以下のようなメソッドを使用している場合、生成されたオブジェクトのバックエンドオブジェクトを解放するのに Recycle() を実行する必要があります。

– NotesFactory.createSession
– CORBA に関連した関数呼び出し

コード例 (2)
Session s = NotesFactory.createSession();
DbDirectory Dir = s.getDbDirectory(null);
Database db = Dir.getFirstDatabase(Dir.DATABASE);


ビュー内の文書をループする場合など、大きなコレクションを扱う場合にも Recycle() を実施する必要があります。
以下がその例です。

コード例(3)
Document doc = v.getFirstDocument();
Document temp = null;

while (doc != null)
{
 // 取得した文書に関する処理をここで行います。
 temp = v.getNextDocument(doc);
 // 次の文書を取得します
 doc.recycle();
  // 処理の終わったオブジェクトをRecycleします。
  // 明示的にnull を代入してガベージコレクションの動作を促
  // 進出来ることがありますが、必ずしも必要ではありません。
  doc = null
 doc = temp;
}

このようにオブジェクトの利用後に Recycle() メソッドを使用することを推奨していますが、System.gc() を使ってガベージコレクション自体を明示的に実行するようなコードを記述する必要はありません。また、System.runFinalization() のように強制的にファイナライズを実行するようなメソッドについても同様です。このようなコードは JVM やガベージコレクタが過負荷に陥ることの一因にもなるため、使用はできるだけ避けるようにするべきです。


5. Java アプリケーションの問題のトラブルシューティング

5.1 基本情報の収集
Java アプリケーションの問題を特定するには、始めにどのアプリケーションがどの程度問題を起こしているのか特定する必要があります。
すぐにアプリケーションが特定できない場合は以下のような Notes.ini パラメータをセットして、起動したエージェントをログして記録する必要があります。Servlet やリモートアクセスアプリケーションのような場合には後述するアプリケーション側でログを行う方法を検討して下さい。

Web エージェントの場合
AGENTTHREADDEBUG=1 (6.x のみ)
DEBUG_AGENT_THREAD=1 (7.x のみ)
HttpDebugEnableHistory=1 (6.5.4 FP3、6.5.5 以降、7.x)
DebugShowJavaAgentTID=1

AMgr タスクで稼動するバックグラウンドエージェントの場合
DEBUG_AMGR=*

5.2 アプリケーション側で行う出力
JVM ヒープの使用量を取得するには、Runtime.getRuntime().totalMemory() や Runtime.getRuntime().freeMemory() を使用します(どちらも静的メソッドなのでインスタンスを作成せずに実行することができます)。
また、アプリケーションの大きなループの前後や重要なポイントでこれらのメソッドを使用したり、アプリケーションの重要な値を出力して、どこで負荷がかかりやすいか、などを特定します。

アプリケーションの重要なロジック内で Java のコアダンプを出力するには、com.ibm.jvm.Dump.JavaDump() メソッドを使用します。しかし、この出力は負荷が高いため、この出力を行う際にはテスト環境や開発環境で実行して下さい。

5.3 HeapDump/Java Core Dump
JVM ヒープの利用状況を詳細に把握するために、Heapdump や JavaDump を利用することができます。詳細については IBM Java Diagnostics Guide 5.0 をご参照下さい。ただしこれらを使用するには Lotus Notes/Domino 6.5.5/7.0.1 以降である必要があります。

5.4 Windows 形式のミニダンプと JExtract
Java に関連した処理では NSD で正しく関数名が出力されないことがあります。
そのようなときのために、NSD では Windows の一般的なプロセスダンプの形式で出力する形式が、6.5.5 以降の Lotus Notes/Domino でサポートされています。ここで出力したファイルは jvm ディレクトリにある JExtract を使用して解析することができます。詳細については IBM Java Diagnostics Guide 5.0 をご参照下さい。


関連文書

「(参考)UNIX プラットフォームの Lotus Domino にインストールされている Java のバージョンについて」(Technote #1465433)
「(参考)IBM Lotus 製品でサポートされている Java のバージョン」(Technote #1466833)

(英文)「Troubleshooting Java agent message 'Error cleaning up agent threads」(Technote #1141368)
(英文)「Error: 'xxxx are not supported in -source 1.3' when executing agent」(Technote #1268852)

(英文)「Java access to the Domino Objects, Part 1」(developerWorks)
(英文)「Java access to the Domino Objects, Part 2」(developerWorks)

(英文)「Java Diagnostics Guide 6」(Infocenter)
(英文)「Java Diagnostics Guide 5.0」(Inforcenter)
(英文)「Java Diagnostics Guide 1.4.2」(Inforcenter)

クロスリファレンス情報
区分 製品 コンポーネント プラットフォーム バージョン エディション
Messaging Applications IBM Notes

Historical Number

729912

Document information

More support for: IBM Domino

Software version: 6.0, 6.5, 7.0, 8.0, 8.5

Operating system(s): Windows

Reference #: 1466201

Modified date: 13 July 2011