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オブジェクト参照の領域を指しています。このため,これを使ってサービスルーチンを呼び出さないでください。アクセス違反や実行時エラーとなります。
All Rights Reserved. Copyright (C) 2014, 2016, Hitachi, Ltd.