COBOL2002 Javaプログラム呼び出し機能ガイド


3.2.5 Javaオブジェクト参照の使用ガイドライン

Javaプログラム呼び出し機能のサービスルーチンから取得したJavaオブジェクト参照は,必ず解放する必要があります。

解放しない場合,Java VMのガーベジコレクションでオブジェクトを解放できないため,メモリリークの原因になります。

COBOLプログラムでJavaオブジェクト参照を扱う場合は,次のガイドラインに従ってください。

  1. Javaオブジェクト参照用の領域はポインタ項目(USAGE POINTER)として記述します。

    パラメタ型集団項目の中に記述する場合を除いて,できるだけ01レベルの項目(01または77)としてください。

    従属項目として記述された場合,上位の集団項目の操作でポインタ項目に不当な値が設定され,不正な動作となることがあります。

  2. 一つのJavaオブジェクト参照は必ず一つのポインタ項目に格納してください。

    Javaオブジェクト参照を別のポインタ項目に転記したい場合は,COMPUTE文やSET文を使って転記しないで,必ずCBLJCOPYサービスルーチンで複製を作成して転記してください。そして,不要になったら必ず両方のJavaオブジェクト参照を解放してください。

    COMPUTE文やSET文を使って転記すると,多重解放の原因になります。

  3. 不要になったJavaオブジェクト参照は,CBLJRELEASEサービスルーチンまたはCBLJSETNULLサービスルーチンで必ず解放してください。

    なお,次のJavaオブジェクト参照は,これらのサービスルーチンを使用しなくても自動的に解放されます。ただし,解放漏れを防止するために,これらのサービスルーチンで明示的に解放することをお勧めします。

    • 次のサービスルーチン呼び出しの受け取りのポインタ項目に格納されているJavaオブジェクト参照

      ・CBLJGETSTATICFIELDサービスルーチン

      ・CBLJSTATICINVOKEサービスルーチン

      ・CBLJNEWサービスルーチン

      ・CBLJGETFIELDサービスルーチン

      ・CBLJINVOKEサービスルーチン

      ・CBLJXTOSTRINGサービスルーチン

      ・CBLJNTOSTRINGサービスルーチン

      ・CBLJNEWARRAYサービスルーチン

      ・CBLJGETOBJARRAYサービスルーチン

    • CBLJFINALIZEサービスルーチンを呼び出した場合の未解放のすべてのJavaオブジェクト参照

  4. 手続き部でJavaオブジェクト参照用のポインタ項目をNULLで初期化する場合は,SET文またはINITIALIZE文を使用しないで,必ずCBLJSETNULLサービスルーチンを使用してください。

    SET文またはINITIALIZE文を使用した場合,格納されていたJavaオブジェクト参照を解放できなくなります。

    CBLJSETNULLサービスルーチンは,ポインタ項目にJavaオブジェクト参照が入っていれば,解放してからNULLを設定します。

  5. Javaオブジェクト参照用のポインタ項目を引数に指定する場合は,BY CONTENTやBY VALUEではなく,必ずBY REFERENCEにしてください。

  6. Javaオブジェクト参照用のポインタ項目は,RETURNING指定には指定しないでください。

  7. Javaオブジェクト参照は,C言語などの他言語プログラムには渡さないでください。

  8. Javaオブジェクト参照用のポインタ項目を,局所場所節または初期化プログラムやCANCEL文でキャンセルされるプログラムの作業場所節に指定した場合は,そのプログラムがリターンするまでに必ず解放してください。

  9. CBLJFINALIZEサービスルーチンを呼び出すと,未解放のすべてのJavaオブジェクト参照は解放されます。

    CBLJFINALIZEサービスルーチンを呼び出したあとは,Javaオブジェクト参照用のポインタ項目のアドレスは解放されたJavaオブジェクト参照の領域を指しています。このため,これを使ってサービスルーチンを呼び出さないでください。アクセス違反や実行時エラーとなります。