RLK.MICRO
RLK (リソースリーク) 指摘は、割り当てられたリソースが使用後に適切に破棄されなかった場合に報告されます。リソースが適切に破棄されないと、次のような問題につながる可能性があります。
- 開いているファイル数が多すぎる
- 必要なときにアプリケーションが一時ファイルにアクセスできない
警告 RLK.MICRO は、JavaME 接続が終了時に閉じられていないことを示します。
脆弱性とリスク
ストリーム、接続、グラフィックオブジェクトなどのリソースは、明示的に閉じられる必要があります。閉じる操作により、トランザクションをアンブロックすることや、ファイルシステム内のファイルの変更をフラッシュすることができます。リソースは、最終的にはガーベッジコレクタにより閉じられますが、ガーベッジコレクションが開始される前にリソースの枯渇が発生する可能性があります。リソースの性質によっては、別のリソース割り当ての失敗時に、さまざまな例外がスローされます。次のような例外があります:java.io.FileNotFoundException:開かれたファイルが多すぎるか、データベース接続が多すぎます。
軽減と防止
重要でないと考えられるリソースであっても、メソッドを持つリソースはすべて明示的に閉じてください。こうすることで、将来的なコード変更時にもこのようなエラーから安全が保たれます。
例 1
コピー
public byte[] getData(final String url) throws IOException {
ContentConnection connection = (ContentConnection) Connector.open(url); // Resource allocated
InputStream iStrm = connection.openInputStream();
int length = (int) connection.getLength();
if (length > 0) {
byte data[] = new byte[length];
iStrm.read(data);
return data;
}
return EMPTY;
}
RLK.MICRO が 21 行目のスニペットに対して報告されています。'connection' が終了時に閉じられていません。
例 2
コピー
public byte[] getData(final String url) throws IOException {
ContentConnection connection = (ContentConnection) Connector.open(url); // Resource allocated
try {
InputStream iStrm = connection.openInputStream();
int length = (int) connection.getLength();
if (length > 0) {
byte data[] = new byte[length];
iStrm.read(data);
return data;
}
return EMPTY;
} finally {
connection.close(); // Resource released
}
}
例 1 のスニペットを修正しました。 フィールドは、RLK.MICRO は報告されていません。
外部参考資料
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。