5章外部リソースを扱う
他人の負荷を軽くする者に、無用な者はいない。
――Charles Dickens
Java仮想マシン(JVM)は、自動的にガベージコレクション(GC)を行っているものだと信じているかもしれません。確かに、内部リソースだけを使っている場合はJVMにGCを任せられることは事実です。しかし、データベース接続、ファイルやソケット、そしてネイティブリソースといった外部リソースを使用する場合は、GCは開発者の責任範囲です。
Javaはいくつかの適切なリソース解放のオプションを提供しています。しかし、これから本章で見るように、これらのオプションはラムダ式を使う場合ほど効率的ではありません。本章では、ラムダ式を使ってexecute around method(EAM)†1を実装します。execute around methodパターンによって、連続操作をより効率的に制御できます。そしてこのパターンを使って、ロック管理と書き込み例外のテストを行います。
[†1] http://c2.com/cgi/wiki?ExecuteAroundMethod
5.1 リソースの解放
GCの扱いは苦痛を伴うことがあります。以前、筆者はアプリケーションのデバッグの依頼を受けたことがあり、そのアプリケーションは使用率が高くなると落ちました。開発者はその問題を「正常に動きます…ほとんどの場合は。」と説明しました。調べてみると、そのアプリケーションはfinalize()
メソッドを使ってデータベース接続を解放しており、JVMは十分なメモリを持っているのでGCを走らせる必要はないと判断したのです。ファイナライザが呼ばれることが滅多になかったために外部リソースが溜まり、アプリケーションの動作が不安定になったのです。 ...
Get Javaによる関数型プログラミング ―Java 8ラムダ式とStream now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.