RLK.NIO

RLK (リソースリーク) 指摘は、割り当てられたリソースが使用後に適切に破棄されなかった場合に報告されます。リソースが適切に破棄されないと、次のような問題につながる可能性があります。

  • 開いているファイル数が多すぎる
  • アプリケーションが、必要なときに一時ファイルにアクセスできない

警告 RLK.NIO は、NIO オブジェクトが終了時に閉じられていないことを示します。

脆弱性とリスク

ストリーム、接続、グラフィックオブジェクトなどのリソースは、明示的に閉じられる必要があります。閉じる操作により、トランザクションをアンブロックすることや、ファイルシステム内のファイルの変更をフラッシュすることができます。リソースは、最終的にはガーベッジコレクタにより閉じられますが、ガーベッジコレクションが開始される前にリソースの枯渇が発生する可能性があります。リソースの性質によっては、別のリソース割り当ての失敗時に、さまざまな例外がスローされます。次のような例外があります:java.io.FileNotFoundException:開かれたファイルが多すぎるか、データベース接続が多すぎます。

軽減と防止

重要でないと考えられるリソースであっても、メソッドを持つリソースはすべて明示的に閉じてください。こうすることで、将来的なコード変更時にもこのようなエラーから安全が保たれます。

例 1

21     public void channelData(final FileInputStream stream, final byte[] data) {
22         try {
23             DatagramChannel ch = DatagramChannel.open(); // リソースが割り当てられます
24             ch.configureBlocking(true);
25             ByteBuffer packet = ByteBuffer.wrap(data);
26             ch.send(packet, dest);
27             ch.close();
28         } catch (IOException e) {
29             System.err.println(e.getMessage());
30         }
31     }

RLK.NIO が 23 行目のスニペットに対して報告されています。DatagramChannel 'ch' が作成後に破棄されていません。

例 2

21     public void channelData(final FileInputStream stream, final byte[] data) {
22         DatagramChannel ch = null;
23         try {
24             ch = DatagramChannel.open(); // リソースが割り当てられます
25             try {
26                 ch.configureBlocking(true);
27                 ByteBuffer packet = ByteBuffer.wrap(data);
28                 ch.send(packet, dest);
29             } finally {
30                 ch.close(); // リソースが解放されます
31             }
32         } catch (IOException e) {
33             System.err.println(e.getMessage());
34         }
35     }

例 1 のスニペットを修正しました。 フィールドは、RLK.NIO は報告されていません。

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。