3.2.5 Javaオブジェクト参照の使用ガイドライン
Javaプログラム呼び出し機能のサービスルーチンから取得したJavaオブジェクト参照は,必ず解放する必要があります。
解放しない場合,Java VMのガーベジコレクションでオブジェクトを解放できないため,メモリリークの原因になります。
COBOLプログラムでJavaオブジェクト参照を扱う場合は,次のガイドラインに従ってください。
-
Javaオブジェクト参照用の領域はポインタ項目(USAGE POINTER)として記述します。
パラメタ型集団項目の中に記述する場合を除いて,できるだけ01レベルの項目(01または77)としてください。
従属項目として記述された場合,上位の集団項目の操作でポインタ項目に不当な値が設定され,不正な動作となることがあります。
-
一つのJavaオブジェクト参照は必ず一つのポインタ項目に格納してください。
Javaオブジェクト参照を別のポインタ項目に転記したい場合は,COMPUTE文やSET文を使って転記しないで,必ずCBLJCOPYサービスルーチンで複製を作成して転記してください。そして,不要になったら必ず両方のJavaオブジェクト参照を解放してください。
COMPUTE文やSET文を使って転記すると,多重解放の原因になります。
-
不要になったJavaオブジェクト参照は,CBLJRELEASEサービスルーチンまたはCBLJSETNULLサービスルーチンで必ず解放してください。
なお,次のJavaオブジェクト参照は,これらのサービスルーチンを使用しなくても自動的に解放されます。ただし,解放漏れを防止するために,これらのサービスルーチンで明示的に解放することをお勧めします。
-
次のサービスルーチン呼び出しの受け取りのポインタ項目に格納されているJavaオブジェクト参照
・CBLJGETSTATICFIELDサービスルーチン
・CBLJSTATICINVOKEサービスルーチン
・CBLJNEWサービスルーチン
・CBLJGETFIELDサービスルーチン
・CBLJINVOKEサービスルーチン
・CBLJXTOSTRINGサービスルーチン
・CBLJNTOSTRINGサービスルーチン
・CBLJNEWARRAYサービスルーチン
・CBLJGETOBJARRAYサービスルーチン
-
CBLJFINALIZEサービスルーチンを呼び出した場合の未解放のすべてのJavaオブジェクト参照
-
-
手続き部でJavaオブジェクト参照用のポインタ項目をNULLで初期化する場合は,SET文またはINITIALIZE文を使用しないで,必ずCBLJSETNULLサービスルーチンを使用してください。
SET文またはINITIALIZE文を使用した場合,格納されていたJavaオブジェクト参照を解放できなくなります。
CBLJSETNULLサービスルーチンは,ポインタ項目にJavaオブジェクト参照が入っていれば,解放してからNULLを設定します。
-
Javaオブジェクト参照用のポインタ項目を引数に指定する場合は,BY CONTENTやBY VALUEではなく,必ずBY REFERENCEにしてください。
-
Javaオブジェクト参照用のポインタ項目は,RETURNING指定には指定しないでください。
-
Javaオブジェクト参照は,C言語などの他言語プログラムには渡さないでください。
-
Javaオブジェクト参照用のポインタ項目を,局所場所節または初期化プログラムやCANCEL文でキャンセルされるプログラムの作業場所節に指定した場合は,そのプログラムがリターンするまでに必ず解放してください。
-
CBLJFINALIZEサービスルーチンを呼び出すと,未解放のすべてのJavaオブジェクト参照は解放されます。
CBLJFINALIZEサービスルーチンを呼び出したあとは,Javaオブジェクト参照用のポインタ項目のアドレスは解放されたJavaオブジェクト参照の領域を指しています。このため,これを使ってサービスルーチンを呼び出さないでください。アクセス違反や実行時エラーとなります。